From 5b591a94b58df75ebcb6fdc9f03245f76649f9e9 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Wed, 17 Jul 2019 15:26:07 +0700 Subject: [PATCH 001/205] This I made for people who cant configure the esx_kashacters and to fix all the issue ! thanks to KASH to make this nice Feature Thanks You KASH (github.com/KASHZIN)Who The Original Develop This ESX_KASHACTERS RELEASE And To for the tutorial XxFri3ndlyxX (github.com/XxFri3ndlyxX) this tutorial i made little bit use XxFri3ndlyxX tutorial 1.Step One [ essentialmode\client\main.lua ] Delete Or Replace This ! --[[Citizen.CreateThread(function() while true do Citizen.Wait(0) if NetworkIsSessionStarted() then TriggerServerEvent('es:firstJoinProper') TriggerEvent('es:allowedToSpawn') return end end end)]]-- 2.Step Two [ es_extended [ LINE : 457 ] client/main.lua ] This To Fix Cant Open Inventory When You Die And Get Revived Change You Menu interactions to this ! ``` ---Menu interactions Citizen.CreateThread(function() while true do Citizen.Wait(0) if IsControlJustReleased(0, 289) and IsInputDisabled(0) and not ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then ESX.ShowInventory() end end end)``` 3. Step Three To Get Your esx_kashacters work you need do this on your database SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner' And This SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'indentifier' Credit @Xnubil 6. Step Six [Fix Datastore] Duplicate Your esx_datastore or add This line on your esx_datastore server\main.lua -- Fix was taken from this link -- -- https://forum.fivem.net/t/release-esx-kashacters-multi-character/251613/448?u=xxfri3ndlyxx -- AddEventHandler('esx:playerLoaded', function(source) local result = MySQL.Sync.fetchAll('SELECT * FROM datastore') for i=1, #result, 1 do local name = result[i].name local label = result[i].label local shared = result[i].shared local result2 = MySQL.Sync.fetchAll('SELECT * FROM datastore_data WHERE name = @name', { ['@name'] = name }) if shared == 0 then table.insert(DataStoresIndex, name) DataStores[name] = {} for j=1, #result2, 1 do local storeName = result2[j].name local storeOwner = result2[j].owner local storeData = (result2[j].data == nil and {} or json.decode(result2[j].data)) local dataStore = CreateDataStore(storeName, storeOwner, storeData) table.insert(DataStores[name], dataStore) end end end local _source = source local xPlayer = ESX.GetPlayerFromId(_source) local dataStores = {} for i=1, #DataStoresIndex, 1 do local name = DataStoresIndex[i] local dataStore = GetDataStore(name, xPlayer.identifier) if dataStore == nil then MySQL.Async.execute('INSERT INTO datastore_data (name, owner, data) VALUES (@name, @owner, @data)', { ['@name'] = name, ['@owner'] = xPlayer.identifier, ['@data'] = '{}' }) dataStore = CreateDataStore(name, xPlayer.identifier, {}) table.insert(DataStores[name], dataStore) end table.insert(dataStores, dataStore) end xPlayer.set('dataStores', dataStores) end) Download Link : https://github.com/XxFri3ndlyxX/esx_datastore Credits : https://github.com/XxFri3ndlyxX 5. Step Five [ Fix Ambulance ] This To Fix Die Tele And When Your Get Revived You Cant Open any Menu only F2 Download My File the esx_ambulancejob (or download the lastest version esx_ambulancejob :v) 6. Step Six [ Fix your esx_kashacters identifier ] Download My mysql-async And start on your server.cfg 7. Step Seven [ Fix Your Identifier And Spawn] Download My esx_kashacters Modified And start on your server.cfg Thats All Identifier [esx_kashacters\server\main.lua] maybe thats all you need in Roleplay Server if you wan to change just change it ===--------------------------------------------------------------------=== Okey Thats All Make My esx_kashacters work properly if you wanna ask My Discord : Blue.#5108 Thank you Again to KASH And XxFri3ndlyxX ! :) ENJOY YOUR ESX_KASHACTERS --- esx_ambulancejob/LICENSE | 674 + esx_ambulancejob/README.md | 48 + esx_ambulancejob/__resource.lua | 40 + esx_ambulancejob/client/job.lua | 918 + esx_ambulancejob/client/main.lua | 396 + esx_ambulancejob/config.lua | 175 + esx_ambulancejob/esx_ambulancejob.sql | 33 + esx_ambulancejob/locales/br.lua | 90 + esx_ambulancejob/locales/cs.lua | 90 + esx_ambulancejob/locales/en.lua | 90 + esx_ambulancejob/locales/es.lua | 90 + esx_ambulancejob/locales/fi.lua | 90 + esx_ambulancejob/locales/fr.lua | 90 + esx_ambulancejob/locales/pl.lua | 90 + esx_ambulancejob/locales/sv.lua | 90 + .../localization/cs_esx_ambulancejob.sql | 33 + .../localization/de_esx_ambulancejob.sql | 33 + .../localization/en_esx_ambulancejob.sql | 33 + .../localization/fi_esx_ambulancejob.sql | 33 + .../localization/pl_esx_ambulancejob.sql | 33 + esx_ambulancejob/server/main.lua | 306 + esx_kashacter-edited-bluebens.zip | Bin 0 -> 193522 bytes esx_kashacters/README.md | 284 + esx_kashacters/__resource.lua | 19 + esx_kashacters/client/main.lua | 120 + esx_kashacters/esx_kashacters.sql | 39 + esx_kashacters/html/css/main.css | 72 + esx_kashacters/html/js/app.js | 72 + esx_kashacters/html/ui.html | 70 + esx_kashacters/server/main.lua | 122 + mysql-async/LICENSE | 14 + mysql-async/README.md | 126 + mysql-async/UPGRADING.md | 55 + mysql-async/__resource.lua | 3 + mysql-async/example.lua | 84 + mysql-async/lib/MySQL.lua | 212 + mysql-async/mysql-async.js | 14510 ++++++++++++++++ mysql-async/src/mysql.js | 139 + mysql-async/src/package.json | 22 + mysql-async/src/webpack.config.js | 14 + readME.txt | 130 + 41 files changed, 19582 insertions(+) create mode 100644 esx_ambulancejob/LICENSE create mode 100644 esx_ambulancejob/README.md create mode 100644 esx_ambulancejob/__resource.lua create mode 100644 esx_ambulancejob/client/job.lua create mode 100644 esx_ambulancejob/client/main.lua create mode 100644 esx_ambulancejob/config.lua create mode 100644 esx_ambulancejob/esx_ambulancejob.sql create mode 100644 esx_ambulancejob/locales/br.lua create mode 100644 esx_ambulancejob/locales/cs.lua create mode 100644 esx_ambulancejob/locales/en.lua create mode 100644 esx_ambulancejob/locales/es.lua create mode 100644 esx_ambulancejob/locales/fi.lua create mode 100644 esx_ambulancejob/locales/fr.lua create mode 100644 esx_ambulancejob/locales/pl.lua create mode 100644 esx_ambulancejob/locales/sv.lua create mode 100644 esx_ambulancejob/localization/cs_esx_ambulancejob.sql create mode 100644 esx_ambulancejob/localization/de_esx_ambulancejob.sql create mode 100644 esx_ambulancejob/localization/en_esx_ambulancejob.sql create mode 100644 esx_ambulancejob/localization/fi_esx_ambulancejob.sql create mode 100644 esx_ambulancejob/localization/pl_esx_ambulancejob.sql create mode 100644 esx_ambulancejob/server/main.lua create mode 100644 esx_kashacter-edited-bluebens.zip create mode 100644 esx_kashacters/README.md create mode 100644 esx_kashacters/__resource.lua create mode 100644 esx_kashacters/client/main.lua create mode 100644 esx_kashacters/esx_kashacters.sql create mode 100644 esx_kashacters/html/css/main.css create mode 100644 esx_kashacters/html/js/app.js create mode 100644 esx_kashacters/html/ui.html create mode 100644 esx_kashacters/server/main.lua create mode 100644 mysql-async/LICENSE create mode 100644 mysql-async/README.md create mode 100644 mysql-async/UPGRADING.md create mode 100644 mysql-async/__resource.lua create mode 100644 mysql-async/example.lua create mode 100644 mysql-async/lib/MySQL.lua create mode 100644 mysql-async/mysql-async.js create mode 100644 mysql-async/src/mysql.js create mode 100644 mysql-async/src/package.json create mode 100644 mysql-async/src/webpack.config.js create mode 100644 readME.txt diff --git a/esx_ambulancejob/LICENSE b/esx_ambulancejob/LICENSE new file mode 100644 index 00000000..dcfcef62 --- /dev/null +++ b/esx_ambulancejob/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + fxserver-esx_ambulancejob + Copyright (C) 2015 Jérémie N'gadi + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + fxserver-esx_ambulancejob Copyright (C) 2015 Jérémie N'gadi + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/esx_ambulancejob/README.md b/esx_ambulancejob/README.md new file mode 100644 index 00000000..f2c3b451 --- /dev/null +++ b/esx_ambulancejob/README.md @@ -0,0 +1,48 @@ +# esx_ambulancejob + +## Requirements + +* Auto mode + - [esx_skin](https://github.com/ESX-Org/esx_skin) + - [esx_vehicleshop](https://github.com/ESX-Org/esx_vehicleshop) + +* Player management (boss actions) + - [esx_society](https://github.com/ESX-Org/esx_society) + +## Download & Installation + +### Using [fvm](https://github.com/qlaffont/fvm-installer) +``` +fvm install --save --folder=esx esx-org/esx_ambulancejob +``` + +### Using Git +``` +cd resources +git clone https://github.com/ESX-Org/esx_ambulancejob [esx]/esx_ambulancejob +``` + +### Manually +- Download https://github.com/ESX-Org/esx_ambulancejob/archive/master.zip +- Put it in the `[esx]` directory + +## Installation +- Import `esx_ambulancejob.sql` in your database +- If you want player management you have to set `Config.EnablePlayerManagement` to `true` in `config.lua` +- Add this in your `server.cfg`: + +``` +start esx_ambulancejob +``` + +# Legal +### License +esx_ambulancejob - ambulance script for fivem + +Copyright (C) 2015-2018 Jérémie N'gadi + +This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. + +This program Is distributed In the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty Of MERCHANTABILITY Or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License For more details. + +You should have received a copy Of the GNU General Public License along with this program. If Not, see http://www.gnu.org/licenses/. diff --git a/esx_ambulancejob/__resource.lua b/esx_ambulancejob/__resource.lua new file mode 100644 index 00000000..5c55606b --- /dev/null +++ b/esx_ambulancejob/__resource.lua @@ -0,0 +1,40 @@ +resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' + +description 'ESX Ambulance Job' + +version '1.2.0' + +server_scripts { + '@mysql-async/lib/MySQL.lua', + '@es_extended/locale.lua', + 'locales/br.lua', + 'locales/en.lua', + 'locales/fi.lua', + 'locales/fr.lua', + 'locales/es.lua', + 'locales/sv.lua', + 'locales/pl.lua', + 'locales/cs.lua', + 'config.lua', + 'server/main.lua' +} + +client_scripts { + '@es_extended/locale.lua', + 'locales/br.lua', + 'locales/en.lua', + 'locales/fi.lua', + 'locales/fr.lua', + 'locales/es.lua', + 'locales/sv.lua', + 'locales/pl.lua', + 'locales/cs.lua', + 'config.lua', + 'client/main.lua', + 'client/job.lua' +} + +dependencies { + 'es_extended', + 'esx_vehicleshop' +} \ No newline at end of file diff --git a/esx_ambulancejob/client/job.lua b/esx_ambulancejob/client/job.lua new file mode 100644 index 00000000..94e5a782 --- /dev/null +++ b/esx_ambulancejob/client/job.lua @@ -0,0 +1,918 @@ +local CurrentAction, CurrentActionMsg, CurrentActionData = nil, '', {} +local HasAlreadyEnteredMarker, LastHospital, LastPart, LastPartNum +local IsBusy = false +local spawnedVehicles, isInShopMenu = {}, false + +function OpenAmbulanceActionsMenu() + local elements = { + {label = _U('cloakroom'), value = 'cloakroom'} + } + + if Config.EnablePlayerManagement and ESX.PlayerData.job.grade_name == 'boss' then + table.insert(elements, {label = _U('boss_actions'), value = 'boss_actions'}) + end + + ESX.UI.Menu.CloseAll() + + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'ambulance_actions', { + title = _U('ambulance'), + align = 'top-left', + elements = elements + }, function(data, menu) + if data.current.value == 'cloakroom' then + OpenCloakroomMenu() + elseif data.current.value == 'boss_actions' then + TriggerEvent('esx_society:openBossMenu', 'ambulance', function(data, menu) + menu.close() + end, {wash = false}) + end + end, function(data, menu) + menu.close() + end) +end + +function OpenMobileAmbulanceActionsMenu() + + ESX.UI.Menu.CloseAll() + + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'mobile_ambulance_actions', { + title = _U('ambulance'), + align = 'top-left', + elements = { + {label = _U('ems_menu'), value = 'citizen_interaction'} + } + }, function(data, menu) + if data.current.value == 'citizen_interaction' then + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'citizen_interaction', { + title = _U('ems_menu_title'), + align = 'top-left', + elements = { + {label = _U('ems_menu_revive'), value = 'revive'}, + {label = _U('ems_menu_small'), value = 'small'}, + {label = _U('ems_menu_big'), value = 'big'}, + {label = _U('ems_menu_putincar'), value = 'put_in_vehicle'} + } + }, function(data, menu) + if IsBusy then return end + + local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer() + + if closestPlayer == -1 or closestDistance > 1.0 then + ESX.ShowNotification(_U('no_players')) + else + + if data.current.value == 'revive' then + + IsBusy = true + + ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(quantity) + if quantity > 0 then + local closestPlayerPed = GetPlayerPed(closestPlayer) + + if IsPedDeadOrDying(closestPlayerPed, 1) then + local playerPed = PlayerPedId() + + ESX.ShowNotification(_U('revive_inprogress')) + + local lib, anim = 'mini@cpr@char_a@cpr_str', 'cpr_pumpchest' + + for i=1, 15, 1 do + Citizen.Wait(900) + + ESX.Streaming.RequestAnimDict(lib, function() + TaskPlayAnim(PlayerPedId(), lib, anim, 8.0, -8.0, -1, 0, 0, false, false, false) + end) + end + + TriggerServerEvent('esx_ambulancejob:removeItem', 'medikit') + TriggerServerEvent('esx_ambulancejob:revive', GetPlayerServerId(closestPlayer)) + + -- Show revive award? + if Config.ReviveReward > 0 then + ESX.ShowNotification(_U('revive_complete_award', GetPlayerName(closestPlayer), Config.ReviveReward)) + else + ESX.ShowNotification(_U('revive_complete', GetPlayerName(closestPlayer))) + end + else + ESX.ShowNotification(_U('player_not_unconscious')) + end + else + ESX.ShowNotification(_U('not_enough_medikit')) + end + + IsBusy = false + + end, 'medikit') + + elseif data.current.value == 'small' then + + ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(quantity) + if quantity > 0 then + local closestPlayerPed = GetPlayerPed(closestPlayer) + local health = GetEntityHealth(closestPlayerPed) + + if health > 0 then + local playerPed = PlayerPedId() + + IsBusy = true + ESX.ShowNotification(_U('heal_inprogress')) + TaskStartScenarioInPlace(playerPed, 'CODE_HUMAN_MEDIC_TEND_TO_DEAD', 0, true) + Citizen.Wait(10000) + ClearPedTasks(playerPed) + + TriggerServerEvent('esx_ambulancejob:removeItem', 'bandage') + TriggerServerEvent('esx_ambulancejob:heal', GetPlayerServerId(closestPlayer), 'small') + ESX.ShowNotification(_U('heal_complete', GetPlayerName(closestPlayer))) + IsBusy = false + else + ESX.ShowNotification(_U('player_not_conscious')) + end + else + ESX.ShowNotification(_U('not_enough_bandage')) + end + end, 'bandage') + + elseif data.current.value == 'big' then + + ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(quantity) + if quantity > 0 then + local closestPlayerPed = GetPlayerPed(closestPlayer) + local health = GetEntityHealth(closestPlayerPed) + + if health > 0 then + local playerPed = PlayerPedId() + + IsBusy = true + ESX.ShowNotification(_U('heal_inprogress')) + TaskStartScenarioInPlace(playerPed, 'CODE_HUMAN_MEDIC_TEND_TO_DEAD', 0, true) + Citizen.Wait(10000) + ClearPedTasks(playerPed) + + TriggerServerEvent('esx_ambulancejob:removeItem', 'medikit') + TriggerServerEvent('esx_ambulancejob:heal', GetPlayerServerId(closestPlayer), 'big') + ESX.ShowNotification(_U('heal_complete', GetPlayerName(closestPlayer))) + IsBusy = false + else + ESX.ShowNotification(_U('player_not_conscious')) + end + else + ESX.ShowNotification(_U('not_enough_medikit')) + end + end, 'medikit') + + elseif data.current.value == 'put_in_vehicle' then + TriggerServerEvent('esx_ambulancejob:putInVehicle', GetPlayerServerId(closestPlayer)) + end + end + end, function(data, menu) + menu.close() + end) + end + + end, function(data, menu) + menu.close() + end) +end + +function FastTravel(coords, heading) + local playerPed = PlayerPedId() + + DoScreenFadeOut(800) + + while not IsScreenFadedOut() do + Citizen.Wait(500) + end + + ESX.Game.Teleport(playerPed, coords, function() + DoScreenFadeIn(800) + + if heading then + SetEntityHeading(playerPed, heading) + end + end) +end + +-- Draw markers & Marker logic +Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + local playerCoords = GetEntityCoords(PlayerPedId()) + local letSleep, isInMarker, hasExited = true, false, false + local currentHospital, currentPart, currentPartNum + + for hospitalNum,hospital in pairs(Config.Hospitals) do + + -- Ambulance Actions + for k,v in ipairs(hospital.AmbulanceActions) do + local distance = GetDistanceBetweenCoords(playerCoords, v, true) + + if distance < Config.DrawDistance then + DrawMarker(Config.Marker.type, v, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Config.Marker.x, Config.Marker.y, Config.Marker.z, Config.Marker.r, Config.Marker.g, Config.Marker.b, Config.Marker.a, false, false, 2, Config.Marker.rotate, nil, nil, false) + letSleep = false + end + + if distance < Config.Marker.x then + isInMarker, currentHospital, currentPart, currentPartNum = true, hospitalNum, 'AmbulanceActions', k + end + end + + -- Pharmacies + for k,v in ipairs(hospital.Pharmacies) do + local distance = GetDistanceBetweenCoords(playerCoords, v, true) + + if distance < Config.DrawDistance then + DrawMarker(Config.Marker.type, v, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Config.Marker.x, Config.Marker.y, Config.Marker.z, Config.Marker.r, Config.Marker.g, Config.Marker.b, Config.Marker.a, false, false, 2, Config.Marker.rotate, nil, nil, false) + letSleep = false + end + + if distance < Config.Marker.x then + isInMarker, currentHospital, currentPart, currentPartNum = true, hospitalNum, 'Pharmacy', k + end + end + + -- Vehicle Spawners + for k,v in ipairs(hospital.Vehicles) do + local distance = GetDistanceBetweenCoords(playerCoords, v.Spawner, true) + + if distance < Config.DrawDistance then + DrawMarker(v.Marker.type, v.Spawner, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, v.Marker.x, v.Marker.y, v.Marker.z, v.Marker.r, v.Marker.g, v.Marker.b, v.Marker.a, false, false, 2, v.Marker.rotate, nil, nil, false) + letSleep = false + end + + if distance < v.Marker.x then + isInMarker, currentHospital, currentPart, currentPartNum = true, hospitalNum, 'Vehicles', k + end + end + + -- Helicopter Spawners + for k,v in ipairs(hospital.Helicopters) do + local distance = GetDistanceBetweenCoords(playerCoords, v.Spawner, true) + + if distance < Config.DrawDistance then + DrawMarker(v.Marker.type, v.Spawner, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, v.Marker.x, v.Marker.y, v.Marker.z, v.Marker.r, v.Marker.g, v.Marker.b, v.Marker.a, false, false, 2, v.Marker.rotate, nil, nil, false) + letSleep = false + end + + if distance < v.Marker.x then + isInMarker, currentHospital, currentPart, currentPartNum = true, hospitalNum, 'Helicopters', k + end + end + + -- Fast Travels + for k,v in ipairs(hospital.FastTravels) do + local distance = GetDistanceBetweenCoords(playerCoords, v.From, true) + + if distance < Config.DrawDistance then + DrawMarker(v.Marker.type, v.From, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, v.Marker.x, v.Marker.y, v.Marker.z, v.Marker.r, v.Marker.g, v.Marker.b, v.Marker.a, false, false, 2, v.Marker.rotate, nil, nil, false) + letSleep = false + end + + + if distance < v.Marker.x then + FastTravel(v.To.coords, v.To.heading) + end + end + + -- Fast Travels (Prompt) + for k,v in ipairs(hospital.FastTravelsPrompt) do + local distance = GetDistanceBetweenCoords(playerCoords, v.From, true) + + if distance < Config.DrawDistance then + DrawMarker(v.Marker.type, v.From, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, v.Marker.x, v.Marker.y, v.Marker.z, v.Marker.r, v.Marker.g, v.Marker.b, v.Marker.a, false, false, 2, v.Marker.rotate, nil, nil, false) + letSleep = false + end + + if distance < v.Marker.x then + isInMarker, currentHospital, currentPart, currentPartNum = true, hospitalNum, 'FastTravelsPrompt', k + end + end + + end + + -- Logic for exiting & entering markers + if isInMarker and not HasAlreadyEnteredMarker or (isInMarker and (LastHospital ~= currentHospital or LastPart ~= currentPart or LastPartNum ~= currentPartNum)) then + + if + (LastHospital ~= nil and LastPart ~= nil and LastPartNum ~= nil) and + (LastHospital ~= currentHospital or LastPart ~= currentPart or LastPartNum ~= currentPartNum) + then + TriggerEvent('esx_ambulancejob:hasExitedMarker', LastHospital, LastPart, LastPartNum) + hasExited = true + end + + HasAlreadyEnteredMarker, LastHospital, LastPart, LastPartNum = true, currentHospital, currentPart, currentPartNum + + TriggerEvent('esx_ambulancejob:hasEnteredMarker', currentHospital, currentPart, currentPartNum) + + end + + if not hasExited and not isInMarker and HasAlreadyEnteredMarker then + HasAlreadyEnteredMarker = false + TriggerEvent('esx_ambulancejob:hasExitedMarker', LastHospital, LastPart, LastPartNum) + end + + if letSleep then + Citizen.Wait(500) + end + end +end) + +AddEventHandler('esx_ambulancejob:hasEnteredMarker', function(hospital, part, partNum) + if ESX.PlayerData.job and ESX.PlayerData.job.name == 'ambulance' then + if part == 'AmbulanceActions' then + CurrentAction = part + CurrentActionMsg = _U('actions_prompt') + CurrentActionData = {} + elseif part == 'Pharmacy' then + CurrentAction = part + CurrentActionMsg = _U('open_pharmacy') + CurrentActionData = {} + elseif part == 'Vehicles' then + CurrentAction = part + CurrentActionMsg = _U('garage_prompt') + CurrentActionData = {hospital = hospital, partNum = partNum} + elseif part == 'Helicopters' then + CurrentAction = part + CurrentActionMsg = _U('helicopter_prompt') + CurrentActionData = {hospital = hospital, partNum = partNum} + elseif part == 'FastTravelsPrompt' then + local travelItem = Config.Hospitals[hospital][part][partNum] + + CurrentAction = part + CurrentActionMsg = travelItem.Prompt + CurrentActionData = {to = travelItem.To.coords, heading = travelItem.To.heading} + end + end +end) + +AddEventHandler('esx_ambulancejob:hasExitedMarker', function(hospital, part, partNum) + if not isInShopMenu then + ESX.UI.Menu.CloseAll() + end + + CurrentAction = nil +end) + +-- Key Controls +Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + + if CurrentAction then + ESX.ShowHelpNotification(CurrentActionMsg) + + if IsControlJustReleased(0, Keys['E']) then + + if CurrentAction == 'AmbulanceActions' then + OpenAmbulanceActionsMenu() + elseif CurrentAction == 'Pharmacy' then + OpenPharmacyMenu() + elseif CurrentAction == 'Vehicles' then + OpenVehicleSpawnerMenu(CurrentActionData.hospital, CurrentActionData.partNum) + elseif CurrentAction == 'Helicopters' then + OpenHelicopterSpawnerMenu(CurrentActionData.hospital, CurrentActionData.partNum) + elseif CurrentAction == 'FastTravelsPrompt' then + FastTravel(CurrentActionData.to, CurrentActionData.heading) + end + + CurrentAction = nil + + end + + elseif ESX.PlayerData.job ~= nil and ESX.PlayerData.job.name == 'ambulance' and not IsDead then + if IsControlJustReleased(0, Keys['F6']) then + OpenMobileAmbulanceActionsMenu() + end + else + Citizen.Wait(500) + end + end +end) + +RegisterNetEvent('esx_ambulancejob:putInVehicle') +AddEventHandler('esx_ambulancejob:putInVehicle', function() + local playerPed = PlayerPedId() + local coords = GetEntityCoords(playerPed) + + if IsAnyVehicleNearPoint(coords, 5.0) then + local vehicle = GetClosestVehicle(coords, 5.0, 0, 71) + + if DoesEntityExist(vehicle) then + local maxSeats, freeSeat = GetVehicleMaxNumberOfPassengers(vehicle) + + for i=maxSeats - 1, 0, -1 do + if IsVehicleSeatFree(vehicle, i) then + freeSeat = i + break + end + end + + if freeSeat then + TaskWarpPedIntoVehicle(playerPed, vehicle, freeSeat) + end + end + end +end) + +function OpenCloakroomMenu() + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'cloakroom', { + title = _U('cloakroom'), + align = 'top-left', + elements = { + {label = _U('ems_clothes_civil'), value = 'citizen_wear'}, + {label = _U('ems_clothes_ems'), value = 'ambulance_wear'}, + } + }, function(data, menu) + if data.current.value == 'citizen_wear' then + ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin) + TriggerEvent('skinchanger:loadSkin', skin) + end) + elseif data.current.value == 'ambulance_wear' then + ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin) + if skin.sex == 0 then + TriggerEvent('skinchanger:loadClothes', skin, jobSkin.skin_male) + else + TriggerEvent('skinchanger:loadClothes', skin, jobSkin.skin_female) + end + end) + end + + menu.close() + end, function(data, menu) + menu.close() + end) +end + +function OpenVehicleSpawnerMenu(hospital, partNum) + local playerCoords = GetEntityCoords(PlayerPedId()) + local elements = { + {label = _U('garage_storeditem'), action = 'garage'}, + {label = _U('garage_storeitem'), action = 'store_garage'}, + {label = _U('garage_buyitem'), action = 'buy_vehicle'} + } + + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle', { + title = _U('garage_title'), + align = 'top-left', + elements = elements + }, function(data, menu) + + if data.current.action == 'buy_vehicle' then + local shopCoords = Config.Hospitals[hospital].Vehicles[partNum].InsideShop + local shopElements = {} + + local authorizedVehicles = Config.AuthorizedVehicles[ESX.PlayerData.job.grade_name] + + if #authorizedVehicles > 0 then + for k,vehicle in ipairs(authorizedVehicles) do + table.insert(shopElements, { + label = ('%s - %s'):format(vehicle.label, _U('shop_item', ESX.Math.GroupDigits(vehicle.price))), + name = vehicle.label, + model = vehicle.model, + price = vehicle.price, + type = 'car' + }) + end + else + return + end + + OpenShopMenu(shopElements, playerCoords, shopCoords) + elseif data.current.action == 'garage' then + local garage = {} + + ESX.TriggerServerCallback('esx_vehicleshop:retrieveJobVehicles', function(jobVehicles) + if #jobVehicles > 0 then + for k,v in ipairs(jobVehicles) do + local props = json.decode(v.vehicle) + local vehicleName = GetLabelText(GetDisplayNameFromVehicleModel(props.model)) + local label = ('%s - %s: '):format(vehicleName, props.plate) + + if v.stored then + label = label .. ('%s'):format(_U('garage_stored')) + else + label = label .. ('%s'):format(_U('garage_notstored')) + end + + table.insert(garage, { + label = label, + stored = v.stored, + model = props.model, + vehicleProps = props + }) + end + + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle_garage', { + title = _U('garage_title'), + align = 'top-left', + elements = garage + }, function(data2, menu2) + if data2.current.stored then + local foundSpawn, spawnPoint = GetAvailableVehicleSpawnPoint(hospital, 'Vehicles', partNum) + + if foundSpawn then + menu2.close() + + ESX.Game.SpawnVehicle(data2.current.model, spawnPoint.coords, spawnPoint.heading, function(vehicle) + ESX.Game.SetVehicleProperties(vehicle, data2.current.vehicleProps) + + TriggerServerEvent('esx_vehicleshop:setJobVehicleState', data2.current.vehicleProps.plate, false) + ESX.ShowNotification(_U('garage_released')) + end) + end + else + ESX.ShowNotification(_U('garage_notavailable')) + end + end, function(data2, menu2) + menu2.close() + end) + + else + ESX.ShowNotification(_U('garage_empty')) + end + end, 'car') + + elseif data.current.action == 'store_garage' then + StoreNearbyVehicle(playerCoords) + end + + end, function(data, menu) + menu.close() + end) + +end + +function StoreNearbyVehicle(playerCoords) + local vehicles, vehiclePlates = ESX.Game.GetVehiclesInArea(playerCoords, 30.0), {} + + if #vehicles > 0 then + for k,v in ipairs(vehicles) do + + -- Make sure the vehicle we're saving is empty, or else it wont be deleted + if GetVehicleNumberOfPassengers(v) == 0 and IsVehicleSeatFree(v, -1) then + table.insert(vehiclePlates, { + vehicle = v, + plate = ESX.Math.Trim(GetVehicleNumberPlateText(v)) + }) + end + end + else + ESX.ShowNotification(_U('garage_store_nearby')) + return + end + + ESX.TriggerServerCallback('esx_ambulancejob:storeNearbyVehicle', function(storeSuccess, foundNum) + if storeSuccess then + local vehicleId = vehiclePlates[foundNum] + local attempts = 0 + ESX.Game.DeleteVehicle(vehicleId.vehicle) + IsBusy = true + + Citizen.CreateThread(function() + while IsBusy do + Citizen.Wait(0) + drawLoadingText(_U('garage_storing'), 255, 255, 255, 255) + end + end) + + -- Workaround for vehicle not deleting when other players are near it. + while DoesEntityExist(vehicleId.vehicle) do + Citizen.Wait(500) + attempts = attempts + 1 + + -- Give up + if attempts > 30 then + break + end + + vehicles = ESX.Game.GetVehiclesInArea(playerCoords, 30.0) + if #vehicles > 0 then + for k,v in ipairs(vehicles) do + if ESX.Math.Trim(GetVehicleNumberPlateText(v)) == vehicleId.plate then + ESX.Game.DeleteVehicle(v) + break + end + end + end + end + + IsBusy = false + ESX.ShowNotification(_U('garage_has_stored')) + else + ESX.ShowNotification(_U('garage_has_notstored')) + end + end, vehiclePlates) +end + +function GetAvailableVehicleSpawnPoint(hospital, part, partNum) + local spawnPoints = Config.Hospitals[hospital][part][partNum].SpawnPoints + local found, foundSpawnPoint = false, nil + + for i=1, #spawnPoints, 1 do + if ESX.Game.IsSpawnPointClear(spawnPoints[i].coords, spawnPoints[i].radius) then + found, foundSpawnPoint = true, spawnPoints[i] + break + end + end + + if found then + return true, foundSpawnPoint + else + ESX.ShowNotification(_U('garage_blocked')) + return false + end +end + +function OpenHelicopterSpawnerMenu(hospital, partNum) + local playerCoords = GetEntityCoords(PlayerPedId()) + ESX.PlayerData = ESX.GetPlayerData() + local elements = { + {label = _U('helicopter_garage'), action = 'garage'}, + {label = _U('helicopter_store'), action = 'store_garage'}, + {label = _U('helicopter_buy'), action = 'buy_helicopter'} + } + + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'helicopter_spawner', { + title = _U('helicopter_title'), + align = 'top-left', + elements = elements + }, function(data, menu) + + if data.current.action == 'buy_helicopter' then + local shopCoords = Config.Hospitals[hospital].Helicopters[partNum].InsideShop + local shopElements = {} + + local authorizedHelicopters = Config.AuthorizedHelicopters[ESX.PlayerData.job.grade_name] + + if #authorizedHelicopters > 0 then + for k,helicopter in ipairs(authorizedHelicopters) do + table.insert(shopElements, { + label = ('%s - %s'):format(helicopter.label, _U('shop_item', ESX.Math.GroupDigits(helicopter.price))), + name = helicopter.label, + model = helicopter.model, + price = helicopter.price, + type = 'helicopter' + }) + end + else + ESX.ShowNotification(_U('helicopter_notauthorized')) + return + end + + OpenShopMenu(shopElements, playerCoords, shopCoords) + elseif data.current.action == 'garage' then + local garage = {} + + ESX.TriggerServerCallback('esx_vehicleshop:retrieveJobVehicles', function(jobVehicles) + if #jobVehicles > 0 then + for k,v in ipairs(jobVehicles) do + local props = json.decode(v.vehicle) + local vehicleName = GetLabelText(GetDisplayNameFromVehicleModel(props.model)) + local label = ('%s - %s: '):format(vehicleName, props.plate) + + if v.stored then + label = label .. ('%s'):format(_U('garage_stored')) + else + label = label .. ('%s'):format(_U('garage_notstored')) + end + + table.insert(garage, { + label = label, + stored = v.stored, + model = props.model, + vehicleProps = props + }) + end + + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'helicopter_garage', { + title = _U('helicopter_garage_title'), + align = 'top-left', + elements = garage + }, function(data2, menu2) + if data2.current.stored then + local foundSpawn, spawnPoint = GetAvailableVehicleSpawnPoint(hospital, 'Helicopters', partNum) + + if foundSpawn then + menu2.close() + + ESX.Game.SpawnVehicle(data2.current.model, spawnPoint.coords, spawnPoint.heading, function(vehicle) + ESX.Game.SetVehicleProperties(vehicle, data2.current.vehicleProps) + + TriggerServerEvent('esx_vehicleshop:setJobVehicleState', data2.current.vehicleProps.plate, false) + ESX.ShowNotification(_U('garage_released')) + end) + end + else + ESX.ShowNotification(_U('garage_notavailable')) + end + end, function(data2, menu2) + menu2.close() + end) + + else + ESX.ShowNotification(_U('garage_empty')) + end + end, 'helicopter') + + elseif data.current.action == 'store_garage' then + StoreNearbyVehicle(playerCoords) + end + + end, function(data, menu) + menu.close() + end) + +end + +function OpenShopMenu(elements, restoreCoords, shopCoords) + local playerPed = PlayerPedId() + isInShopMenu = true + + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle_shop', { + title = _U('vehicleshop_title'), + align = 'top-left', + elements = elements + }, function(data, menu) + + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle_shop_confirm', { + title = _U('vehicleshop_confirm', data.current.name, data.current.price), + align = 'top-left', + elements = { + { label = _U('confirm_no'), value = 'no' }, + { label = _U('confirm_yes'), value = 'yes' } + } + }, function(data2, menu2) + + if data2.current.value == 'yes' then + local newPlate = exports['esx_vehicleshop']:GeneratePlate() + local vehicle = GetVehiclePedIsIn(playerPed, false) + local props = ESX.Game.GetVehicleProperties(vehicle) + props.plate = newPlate + + ESX.TriggerServerCallback('esx_ambulancejob:buyJobVehicle', function (bought) + if bought then + ESX.ShowNotification(_U('vehicleshop_bought', data.current.name, ESX.Math.GroupDigits(data.current.price))) + + isInShopMenu = false + ESX.UI.Menu.CloseAll() + + DeleteSpawnedVehicles() + FreezeEntityPosition(playerPed, false) + SetEntityVisible(playerPed, true) + + ESX.Game.Teleport(playerPed, restoreCoords) + else + ESX.ShowNotification(_U('vehicleshop_money')) + menu2.close() + end + end, props, data.current.type) + else + menu2.close() + end + + end, function(data2, menu2) + menu2.close() + end) + + end, function(data, menu) + isInShopMenu = false + ESX.UI.Menu.CloseAll() + + DeleteSpawnedVehicles() + FreezeEntityPosition(playerPed, false) + SetEntityVisible(playerPed, true) + + ESX.Game.Teleport(playerPed, restoreCoords) + end, function(data, menu) + DeleteSpawnedVehicles() + + WaitForVehicleToLoad(data.current.model) + ESX.Game.SpawnLocalVehicle(data.current.model, shopCoords, 0.0, function(vehicle) + table.insert(spawnedVehicles, vehicle) + TaskWarpPedIntoVehicle(playerPed, vehicle, -1) + FreezeEntityPosition(vehicle, true) + end) + end) + + WaitForVehicleToLoad(elements[1].model) + ESX.Game.SpawnLocalVehicle(elements[1].model, shopCoords, 0.0, function(vehicle) + table.insert(spawnedVehicles, vehicle) + TaskWarpPedIntoVehicle(playerPed, vehicle, -1) + FreezeEntityPosition(vehicle, true) + end) +end + +Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + + if isInShopMenu then + DisableControlAction(0, 75, true) -- Disable exit vehicle + DisableControlAction(27, 75, true) -- Disable exit vehicle + else + Citizen.Wait(500) + end + end +end) + +function DeleteSpawnedVehicles() + while #spawnedVehicles > 0 do + local vehicle = spawnedVehicles[1] + ESX.Game.DeleteVehicle(vehicle) + table.remove(spawnedVehicles, 1) + end +end + +function WaitForVehicleToLoad(modelHash) + modelHash = (type(modelHash) == 'number' and modelHash or GetHashKey(modelHash)) + + if not HasModelLoaded(modelHash) then + RequestModel(modelHash) + + while not HasModelLoaded(modelHash) do + Citizen.Wait(0) + + DisableControlAction(0, Keys['TOP'], true) + DisableControlAction(0, Keys['DOWN'], true) + DisableControlAction(0, Keys['LEFT'], true) + DisableControlAction(0, Keys['RIGHT'], true) + DisableControlAction(0, 176, true) -- ENTER key + DisableControlAction(0, Keys['BACKSPACE'], true) + + drawLoadingText(_U('vehicleshop_awaiting_model'), 255, 255, 255, 255) + end + end +end + +function drawLoadingText(text, red, green, blue, alpha) + SetTextFont(4) + SetTextScale(0.0, 0.5) + SetTextColour(red, green, blue, alpha) + SetTextDropshadow(0, 0, 0, 0, 255) + SetTextEdge(1, 0, 0, 0, 255) + SetTextDropShadow() + SetTextOutline() + SetTextCentre(true) + + BeginTextCommandDisplayText("STRING") + AddTextComponentSubstringPlayerName(text) + EndTextCommandDisplayText(0.5, 0.5) +end + +function OpenPharmacyMenu() + ESX.UI.Menu.CloseAll() + + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'pharmacy', { + title = _U('pharmacy_menu_title'), + align = 'top-left', + elements = { + {label = _U('pharmacy_take', _U('medikit')), value = 'medikit'}, + {label = _U('pharmacy_take', _U('bandage')), value = 'bandage'} + } + }, function(data, menu) + TriggerServerEvent('esx_ambulancejob:giveItem', data.current.value) + end, function(data, menu) + menu.close() + end) +end + +function WarpPedInClosestVehicle(ped) + local coords = GetEntityCoords(ped) + + local vehicle, distance = ESX.Game.GetClosestVehicle(coords) + + if distance ~= -1 and distance <= 5.0 then + local maxSeats, freeSeat = GetVehicleMaxNumberOfPassengers(vehicle) + + for i=maxSeats - 1, 0, -1 do + if IsVehicleSeatFree(vehicle, i) then + freeSeat = i + break + end + end + + if freeSeat then + TaskWarpPedIntoVehicle(ped, vehicle, freeSeat) + end + else + ESX.ShowNotification(_U('no_vehicles')) + end +end + +RegisterNetEvent('esx_ambulancejob:heal') +AddEventHandler('esx_ambulancejob:heal', function(healType, quiet) + local playerPed = PlayerPedId() + local maxHealth = GetEntityMaxHealth(playerPed) + + if healType == 'small' then + local health = GetEntityHealth(playerPed) + local newHealth = math.min(maxHealth, math.floor(health + maxHealth / 8)) + SetEntityHealth(playerPed, newHealth) + elseif healType == 'big' then + SetEntityHealth(playerPed, maxHealth) + end + + if not quiet then + ESX.ShowNotification(_U('healed')) + end +end) diff --git a/esx_ambulancejob/client/main.lua b/esx_ambulancejob/client/main.lua new file mode 100644 index 00000000..3a8f2c36 --- /dev/null +++ b/esx_ambulancejob/client/main.lua @@ -0,0 +1,396 @@ +Keys = { + ["ESC"] = 322, ["F1"] = 288, ["F2"] = 289, ["F3"] = 170, ["F5"] = 166, ["F6"] = 167, ["F7"] = 168, ["F8"] = 169, ["F9"] = 56, ["F10"] = 57, + ["~"] = 243, ["1"] = 157, ["2"] = 158, ["3"] = 160, ["4"] = 164, ["5"] = 165, ["6"] = 159, ["7"] = 161, ["8"] = 162, ["9"] = 163, ["-"] = 84, ["="] = 83, ["BACKSPACE"] = 177, + ["TAB"] = 37, ["Q"] = 44, ["W"] = 32, ["E"] = 38, ["R"] = 45, ["T"] = 245, ["Y"] = 246, ["U"] = 303, ["P"] = 199, ["["] = 39, ["]"] = 40, ["ENTER"] = 18, + ["CAPS"] = 137, ["A"] = 34, ["S"] = 8, ["D"] = 9, ["F"] = 23, ["G"] = 47, ["H"] = 74, ["K"] = 311, ["L"] = 182, + ["LEFTSHIFT"] = 21, ["Z"] = 20, ["X"] = 73, ["C"] = 26, ["V"] = 0, ["B"] = 29, ["N"] = 249, ["M"] = 244, [","] = 82, ["."] = 81, + ["LEFTCTRL"] = 36, ["LEFTALT"] = 19, ["SPACE"] = 22, ["RIGHTCTRL"] = 70, + ["HOME"] = 213, ["PAGEUP"] = 10, ["PAGEDOWN"] = 11, ["DELETE"] = 178, + ["LEFT"] = 174, ["RIGHT"] = 175, ["TOP"] = 27, ["DOWN"] = 173, + ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 +} + +local FirstSpawn, PlayerLoaded = true, false + +IsDead = false +ESX = nil + +Citizen.CreateThread(function() + while ESX == nil do + TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + Citizen.Wait(0) + end + + while ESX.GetPlayerData().job == nil do + Citizen.Wait(100) + end + + PlayerLoaded = true + ESX.PlayerData = ESX.GetPlayerData() +end) + +RegisterNetEvent('esx:playerLoaded') +AddEventHandler('esx:playerLoaded', function(xPlayer) + ESX.PlayerData = xPlayer + PlayerLoaded = true +end) + +RegisterNetEvent('esx:setJob') +AddEventHandler('esx:setJob', function(job) + ESX.PlayerData.job = job +end) + +AddEventHandler('playerSpawned', function() + IsDead = false + + if FirstSpawn then + exports.spawnmanager:setAutoSpawn(false) -- disable respawn + FirstSpawn = false + + ESX.TriggerServerCallback('esx_ambulancejob:getDeathStatus', function(isDead) + if isDead and Config.AntiCombatLog then + while not PlayerLoaded do + Citizen.Wait(1000) + end + + ESX.ShowNotification(_U('combatlog_message')) + RemoveItemsAfterRPDeath() + end + end) + end +end) + +-- Create blips +Citizen.CreateThread(function() + for k,v in pairs(Config.Hospitals) do + local blip = AddBlipForCoord(v.Blip.coords) + + SetBlipSprite(blip, v.Blip.sprite) + SetBlipScale(blip, v.Blip.scale) + SetBlipColour(blip, v.Blip.color) + SetBlipAsShortRange(blip, true) + + BeginTextCommandSetBlipName('STRING') + AddTextComponentSubstringPlayerName(_U('hospital')) + EndTextCommandSetBlipName(blip) + end +end) + +-- Disable most inputs when dead +Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + + if IsDead then + DisableAllControlActions(0) + EnableControlAction(0, Keys['G'], true) + EnableControlAction(0, Keys['T'], true) + EnableControlAction(0, Keys['E'], true) + else + Citizen.Wait(500) + end + end +end) + +function OnPlayerDeath() + IsDead = true + ESX.UI.Menu.CloseAll() + TriggerServerEvent('esx_ambulancejob:setDeathStatus', true) + + StartDeathTimer() + StartDistressSignal() + + StartScreenEffect('DeathFailOut', 0, false) +end + +RegisterNetEvent('esx_ambulancejob:useItem') +AddEventHandler('esx_ambulancejob:useItem', function(itemName) + ESX.UI.Menu.CloseAll() + + if itemName == 'medikit' then + local lib, anim = 'anim@heists@narcotics@funding@gang_idle', 'gang_chatting_idle01' -- TODO better animations + local playerPed = PlayerPedId() + + ESX.Streaming.RequestAnimDict(lib, function() + TaskPlayAnim(playerPed, lib, anim, 8.0, -8.0, -1, 0, 0, false, false, false) + + Citizen.Wait(500) + while IsEntityPlayingAnim(playerPed, lib, anim, 3) do + Citizen.Wait(0) + DisableAllControlActions(0) + end + + TriggerEvent('esx_ambulancejob:heal', 'big', true) + ESX.ShowNotification(_U('used_medikit')) + end) + + elseif itemName == 'bandage' then + local lib, anim = 'anim@heists@narcotics@funding@gang_idle', 'gang_chatting_idle01' -- TODO better animations + local playerPed = PlayerPedId() + + ESX.Streaming.RequestAnimDict(lib, function() + TaskPlayAnim(playerPed, lib, anim, 8.0, -8.0, -1, 0, 0, false, false, false) + + Citizen.Wait(500) + while IsEntityPlayingAnim(playerPed, lib, anim, 3) do + Citizen.Wait(0) + DisableAllControlActions(0) + end + + TriggerEvent('esx_ambulancejob:heal', 'small', true) + ESX.ShowNotification(_U('used_bandage')) + end) + end +end) + +function StartDistressSignal() + Citizen.CreateThread(function() + local timer = Config.BleedoutTimer + + while timer > 0 and IsDead do + Citizen.Wait(2) + timer = timer - 30 + + SetTextFont(4) + SetTextScale(0.45, 0.45) + SetTextColour(185, 185, 185, 255) + SetTextDropshadow(0, 0, 0, 0, 255) + SetTextEdge(1, 0, 0, 0, 255) + SetTextDropShadow() + SetTextOutline() + BeginTextCommandDisplayText('STRING') + AddTextComponentSubstringPlayerName(_U('distress_send')) + EndTextCommandDisplayText(0.175, 0.805) + + if IsControlPressed(0, Keys['G']) then + SendDistressSignal() + + Citizen.CreateThread(function() + Citizen.Wait(1000 * 60 * 5) + if IsDead then + StartDistressSignal() + end + end) + + break + end + end + end) +end + +function SendDistressSignal() + local playerPed = PlayerPedId() + local coords = GetEntityCoords(playerPed) + + ESX.ShowNotification(_U('distress_sent')) + TriggerServerEvent('esx_phone:send', 'ambulance', _U('distress_message'), false, { + x = coords.x, + y = coords.y, + z = coords.z + }) +end + +function DrawGenericTextThisFrame() + SetTextFont(4) + SetTextScale(0.0, 0.5) + SetTextColour(255, 255, 255, 255) + SetTextDropshadow(0, 0, 0, 0, 255) + SetTextEdge(1, 0, 0, 0, 255) + SetTextDropShadow() + SetTextOutline() + SetTextCentre(true) +end + +function secondsToClock(seconds) + local seconds, hours, mins, secs = tonumber(seconds), 0, 0, 0 + + if seconds <= 0 then + return 0, 0 + else + local hours = string.format("%02.f", math.floor(seconds / 3600)) + local mins = string.format("%02.f", math.floor(seconds / 60 - (hours * 60))) + local secs = string.format("%02.f", math.floor(seconds - hours * 3600 - mins * 60)) + + return mins, secs + end +end + +function StartDeathTimer() + local canPayFine = false + + if Config.EarlyRespawnFine then + ESX.TriggerServerCallback('esx_ambulancejob:checkBalance', function(canPay) + canPayFine = canPay + end) + end + + local earlySpawnTimer = ESX.Math.Round(Config.EarlyRespawnTimer / 1000) + local bleedoutTimer = ESX.Math.Round(Config.BleedoutTimer / 1000) + + Citizen.CreateThread(function() + -- early respawn timer + while earlySpawnTimer > 0 and IsDead do + Citizen.Wait(1000) + + if earlySpawnTimer > 0 then + earlySpawnTimer = earlySpawnTimer - 1 + end + end + + -- bleedout timer + while bleedoutTimer > 0 and IsDead do + Citizen.Wait(1000) + + if bleedoutTimer > 0 then + bleedoutTimer = bleedoutTimer - 1 + end + end + end) + + Citizen.CreateThread(function() + local text, timeHeld + + -- early respawn timer + while earlySpawnTimer > 0 and IsDead do + Citizen.Wait(0) + text = _U('respawn_available_in', secondsToClock(earlySpawnTimer)) + + DrawGenericTextThisFrame() + + SetTextEntry("STRING") + AddTextComponentString(text) + DrawText(0.5, 0.8) + end + + -- bleedout timer + while bleedoutTimer > 0 and IsDead do + Citizen.Wait(0) + text = _U('respawn_bleedout_in', secondsToClock(bleedoutTimer)) + + if not Config.EarlyRespawnFine then + text = text .. _U('respawn_bleedout_prompt') + + if IsControlPressed(0, Keys['E']) and timeHeld > 60 then + RemoveItemsAfterRPDeath() + break + end + elseif Config.EarlyRespawnFine and canPayFine then + text = text .. _U('respawn_bleedout_fine', ESX.Math.GroupDigits(Config.EarlyRespawnFineAmount)) + + if IsControlPressed(0, Keys['E']) and timeHeld > 60 then + TriggerServerEvent('esx_ambulancejob:payFine') + RemoveItemsAfterRPDeath() + break + end + end + + if IsControlPressed(0, Keys['E']) then + timeHeld = timeHeld + 1 + else + timeHeld = 0 + end + + DrawGenericTextThisFrame() + + SetTextEntry("STRING") + AddTextComponentString(text) + DrawText(0.5, 0.8) + end + + if bleedoutTimer < 1 and IsDead then + RemoveItemsAfterRPDeath() + end + end) +end + +function RemoveItemsAfterRPDeath() + TriggerServerEvent('esx_ambulancejob:setDeathStatus', false) + + Citizen.CreateThread(function() + DoScreenFadeOut(800) + + while not IsScreenFadedOut() do + Citizen.Wait(10) + end + + ESX.TriggerServerCallback('esx_ambulancejob:removeItemsAfterRPDeath', function() + local formattedCoords = { + x = Config.RespawnPoint.coords.x, + y = Config.RespawnPoint.coords.y, + z = Config.RespawnPoint.coords.z + } + + ESX.SetPlayerData('lastPosition', formattedCoords) + ESX.SetPlayerData('loadout', {}) + + TriggerServerEvent('esx:updateLastPosition', formattedCoords) + RespawnPed(PlayerPedId(), formattedCoords, Config.RespawnPoint.heading) + + StopScreenEffect('DeathFailOut') + DoScreenFadeIn(800) + end) + end) +end + +function RespawnPed(ped, coords, heading) + SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false, false, true) + NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, heading, true, false) + SetPlayerInvincible(ped, false) + TriggerEvent('playerSpawned', coords.x, coords.y, coords.z) + ClearPedBloodDamage(ped) + + ESX.UI.Menu.CloseAll() +end + +RegisterNetEvent('esx_phone:loaded') +AddEventHandler('esx_phone:loaded', function(phoneNumber, contacts) + local specialContact = { + name = 'Ambulance', + number = 'ambulance', + base64Icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAABp5JREFUWIW1l21sFNcVhp/58npn195de23Ha4Mh2EASSvk0CPVHmmCEI0RCTQMBKVVooxYoalBVCVokICWFVFVEFeKoUdNECkZQIlAoFGMhIkrBQGxHwhAcChjbeLcsYHvNfsx+zNz+MBDWNrYhzSvdP+e+c973XM2cc0dihFi9Yo6vSzN/63dqcwPZcnEwS9PDmYoE4IxZIj+ciBb2mteLwlZdfji+dXtNU2AkeaXhCGteLZ/X/IS64/RoR5mh9tFVAaMiAldKQUGiRzFp1wXJPj/YkxblbfFLT/tjq9/f1XD0sQyse2li7pdP5tYeLXXMMGUojAiWKeOodE1gqpmNfN2PFeoF00T2uLGKfZzTwhzqbaEmeYWAQ0K1oKIlfPb7t+7M37aruXvEBlYvnV7xz2ec/2jNs9kKooKNjlksiXhJfLqf1PXOIU9M8fmw/XgRu523eTNyhhu6xLjbSeOFC6EX3t3V9PmwBla9Vv7K7u85d3bpqlwVcvHn7B8iVX+IFQoNKdwfstuFtWoFvwp9zj5XL7nRlPXyudjS9z+u35tmuH/lu6dl7+vSVXmDUcpbX+skP65BxOOPJA4gjDicOM2PciejeTwcsYek1hyl6me5nhNnmwPXBhjYuGC699OpzoaAO0PbYJSy5vgt4idOPrJwf6QuX2FO0oOtqIgj9pDU5dCWrMlyvXf86xsGgHyPeLos83Brns1WFXLxxgVBorHpW4vfQ6KhkbUtCot6srns1TLPjNVr7+1J0PepVc92H/Eagkb7IsTWd4ZMaN+yCXv5zLRY9GQ9xuYtQz4nfreWGdH9dNlkfnGq5/kdO88ekwGan1B3mDJsdMxCqv5w2Iq0khLs48vSllrsG/Y5pfojNugzScnQXKBVA8hrX51ddHq0o6wwIlgS8Y7obZdUZVjOYLC6e3glWkBBVHC2RJ+w/qezCuT/2sV6Q5VYpowjvnf/iBJJqvpYBgBS+w6wVB5DLEOiTZHWy36nNheg0jUBs3PoJnMfyuOdAECqrZ3K7KcACGQp89RAtlysCphqZhPtRzYlcPx+ExklJUiq0le5omCfOGFAYn3qFKS/fZAWS7a3Y2wa+GJOEy4US+B3aaPUYJamj4oI5LA/jWQBt5HIK5+JfXzZsJVpXi/ac8+mxWIXWzAG4Wb4g/jscNMp63I4U5FcKaVvsNyFALokSA47Kx8PVk83OabCHZsiqwAKEpjmfUJIkoh/R+L9oTpjluhRkGSPG4A7EkS+Y3HZk0OXYpIVNy01P5yItnptDsvtIwr0SunqoVP1GG1taTHn1CloXm9aLBEIEDl/IS2W6rg+qIFEYR7+OJTesqJqYa95/VKBNOHLjDBZ8sDS2998a0Bs/F//gvu5Z9NivadOc/U3676pEsizBIN1jCYlhClL+ELJDrkobNUBfBZqQfMN305HAgnIeYi4OnYMh7q/AsAXSdXK+eH41sykxd+TV/AsXvR/MeARAttD9pSqF9nDNfSEoDQsb5O31zQFprcaV244JPY7bqG6Xd9K3C3ALgbfk3NzqNE6CdplZrVFL27eWR+UASb6479ULfhD5AzOlSuGFTE6OohebElbcb8fhxA4xEPUgdTK19hiNKCZgknB+Ep44E44d82cxqPPOKctCGXzTmsBXbV1j1S5XQhyHq6NvnABPylu46A7QmVLpP7w9pNz4IEb0YyOrnmjb8bjB129fDBRkDVj2ojFbYBnCHHb7HL+OC7KQXeEsmAiNrnTqLy3d3+s/bvlVmxpgffM1fyM5cfsPZLuK+YHnvHELl8eUlwV4BXim0r6QV+4gD9Nlnjbfg1vJGktbI5UbN/TcGmAAYDG84Gry/MLLl/zKouO2Xukq/YkCyuWYV5owTIGjhVFCPL6J7kLOTcH89ereF1r4qOsm3gjSevl85El1Z98cfhB3qBN9+dLp1fUTco+0OrVMnNjFuv0chYbBYT2HcBoa+8TALyWQOt/ImPHoFS9SI3WyRajgdt2mbJgIlbREplfveuLf/XXemjXX7v46ZxzPlfd8YlZ01My5MUEVdIY5rueYopw4fQHkbv7/rZkTw6JwjyalBCHur9iD9cI2mU0UzD3P9H6yZ1G5dt7Gwe96w07dl5fXj7vYqH2XsNovdTI6KMrlsAXhRyz7/C7FBO/DubdVq4nBLPaohcnBeMr3/2k4fhQ+Uc8995YPq2wMzNjww2X+vwNt1p00ynrd2yKDJAVN628sBX1hZIdxXdStU9G5W2bd9YHR5L3f/CNmJeY9G8WAAAAAElFTkSuQmCC' + } + + TriggerEvent('esx_phone:addSpecialContact', specialContact.name, specialContact.number, specialContact.base64Icon) +end) + +AddEventHandler('esx:onPlayerDeath', function(data) + OnPlayerDeath() +end) + +RegisterNetEvent('esx_ambulancejob:revive') +AddEventHandler('esx_ambulancejob:revive', function() + local playerPed = PlayerPedId() + local coords = GetEntityCoords(playerPed) + + TriggerServerEvent('esx_ambulancejob:setDeathStatus', false) + + Citizen.CreateThread(function() + DoScreenFadeOut(800) + + while not IsScreenFadedOut() do + Citizen.Wait(50) + end + + local formattedCoords = { + x = ESX.Math.Round(coords.x, 1), + y = ESX.Math.Round(coords.y, 1), + z = ESX.Math.Round(coords.z, 1) + } + + ESX.SetPlayerData('lastPosition', formattedCoords) + + TriggerServerEvent('esx:updateLastPosition', formattedCoords) + + RespawnPed(playerPed, formattedCoords, 0.0) + + StopScreenEffect('DeathFailOut') + DoScreenFadeIn(800) + end) +end) + +-- Load unloaded IPLs +if Config.LoadIpl then + Citizen.CreateThread(function() + RequestIpl('Coroner_Int_on') -- Morgue + end) +end diff --git a/esx_ambulancejob/config.lua b/esx_ambulancejob/config.lua new file mode 100644 index 00000000..388b975f --- /dev/null +++ b/esx_ambulancejob/config.lua @@ -0,0 +1,175 @@ +Config = {} + +Config.DrawDistance = 100.0 + +Config.Marker = { type = 21, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = true } + +Config.ReviveReward = 350 -- revive reward, set to 0 if you don't want it enabled +Config.AntiCombatLog = true -- enable anti-combat logging? +Config.LoadIpl = true -- disable if you're using fivem-ipl or other IPL loaders + +Config.Locale = 'en' + +local second = 1000 +local minute = 60 * second + +Config.EarlyRespawnTimer = 7 * minute -- Time til respawn is available +Config.BleedoutTimer = 10 * minute -- Time til the player bleeds out + +Config.EnablePlayerManagement = true + +Config.RemoveWeaponsAfterRPDeath = true +Config.RemoveCashAfterRPDeath = true +Config.RemoveItemsAfterRPDeath = true + +-- Let the player pay for respawning early, only if he can afford it. +Config.EarlyRespawnFine = false +Config.EarlyRespawnFineAmount = 5000 + +Config.RespawnPoint = { coords = vector3(281.27, -581.24, 42.75), heading = 65.5 } + +Config.Hospitals = { + + CentralLosSantos = { + + Blip = { + coords = vector3(289.71, -585.82, 42.19), + sprite = 61, + scale = 1.2, + color = 2 + }, + + AmbulanceActions = { + vector3(310.48, -599.23, 43.29) + }, + + Pharmacies = { + vector3(270.5, -1363.22, 24.53) + }, + + Vehicles = { + { + Spawner = vector3(295.27, -600.8, 43.3), + InsideShop = vector3(446.7, -1355.6, 43.5), + Marker = { type = 36, x = 1.0, y = 1.0, z = 1.0, r = 100, g = 50, b = 200, a = 100, rotate = true }, + SpawnPoints = { + { coords = vector3(290.26, -599.41, 43.15), heading = 151.5, radius = 1.0 }, + { coords = vector3(294.0, -1433.1, 29.8), heading = 227.6, radius = 4.0 }, + { coords = vector3(309.4, -1442.5, 29.8), heading = 227.6, radius = 6.0 } + } + } + }, + + Helicopters = { + { + Spawner = vector3(345.46, -580.32, 74.16), + InsideShop = vector3(305.6, -1419.7, 41.5), + Marker = { type = 34, x = 1.5, y = 1.5, z = 1.5, r = 100, g = 150, b = 150, a = 100, rotate = true }, + SpawnPoints = { + { coords = vector3(352.06, -588.03, 74.16), heading = 330.5, radius = 10.0 }, + { coords = vector3(299.5, -1453.2, 46.5), heading = 142.7, radius = 10.0 } + } + } + }, + + FastTravels = { + { + From = vector3(315.48, -583.04, 42.31), + To = { coords = vector3(272.8, -1358.8, 23.5), heading = 0.0 }, + Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } + }, + + { + From = vector3(275.3, -1361, 23.5), + To = { coords = vector3(318.37, -584.1, 42.3), heading = 0.0 }, + Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } + }, + + { + From = vector3(332.9, -591.3, 42.31), + To = { coords = vector3(341.4, -584.99, 73.19), heading = 258.5 }, + Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } + }, + + { + From = vector3(338.56, -583.64, 73.22), + To = { coords = vector3(333.6, -589.61, 43.28), heading = 338.38 }, + Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } + }, + + { + From = vector3(298.57, -584.43, 42.28), + To = { coords = vector3(303.48, -586.12, 42.29), heading = 0.0 }, + Marker = { type = 1, x = 1.5, y = 1.5, z = 1.0, r = 102, g = 0, b = 102, a = 100, rotate = false } + }, + + { + From = vector3(300.57, -585.11, 42.31), + To = { coords = vector3(296.79, -584.34, 42.16), heading = 0.0 }, + Marker = { type = 1, x = 1.5, y = 1.5, z = 1.0, r = 102, g = 0, b = 102, a = 100, rotate = false } + } + }, + + FastTravelsPrompt = { + { + From = vector3(237.4, -1373.8, 26.0), + To = { coords = vector3(251.9, -1363.3, 38.5), heading = 0.0 }, + Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false }, + Prompt = _U('fast_travel') + }, + + { + From = vector3(256.5, -1357.7, 36.0), + To = { coords = vector3(235.4, -1372.8, 26.3), heading = 0.0 }, + Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false }, + Prompt = _U('fast_travel') + } + } + + } +} + +Config.AuthorizedVehicles = { + + ambulance = { + { model = 'ambulance', label = 'Ambulance Van', price = 5000}, + { model = 'dodgesamu', label = 'Dodge Samu', price = 5000} + }, + + doctor = { + { model = 'ambulance', label = 'Ambulance Van', price = 4500}, + { model = 'dodgesamu', label = 'Dodge Samu', price = 5000} + }, + + chief_doctor = { + { model = 'ambulance', label = 'Ambulance Van', price = 3000}, + { model = 'dodgeems', label = 'Dodge EMS', price = 5000} + }, + + boss = { + { model = 'ambulance', label = 'Ambulance Van', price = 2000}, + { model = 'dodgeems', label = 'Dodge EMS', price = 5000} + } + +} + +Config.AuthorizedHelicopters = { + + ambulance = {}, + + doctor = { + { model = 'buzzard2', label = 'Nagasaki Buzzard', price = 20000 }, + { model = 'polmav', label = 'EMS', livery = 1, price = 20000 } + }, + + chief_doctor = { + { model = 'buzzard2', label = 'Nagasaki Buzzard', price = 20000 }, + { model = 'polmav', label = 'EMS', livery = 1, price = 20000 } + }, + + boss = { + { model = 'buzzard2', label = 'Nagasaki Buzzard', price = 20000 }, + { model = 'polmav', label = 'EMS', livery = 1, price = 20000 } + } + +} diff --git a/esx_ambulancejob/esx_ambulancejob.sql b/esx_ambulancejob/esx_ambulancejob.sql new file mode 100644 index 00000000..d88d5676 --- /dev/null +++ b/esx_ambulancejob/esx_ambulancejob.sql @@ -0,0 +1,33 @@ +USE `essentialmode`; + +INSERT INTO `addon_account` (name, label, shared) VALUES + ('society_ambulance', 'Ambulance', 1) +; + +INSERT INTO `addon_inventory` (name, label, shared) VALUES + ('society_ambulance', 'Ambulance', 1) +; + +INSERT INTO `datastore` (name, label, shared) VALUES + ('society_ambulance', 'Ambulance', 1) +; + +INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES + ('ambulance',0,'ambulance','Ambulancier',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',1,'doctor','Medecin',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',2,'chief_doctor','Medecin-chef',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',3,'boss','Chirurgien',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') +; + +INSERT INTO `jobs` (name, label) VALUES + ('ambulance','Ambulance') +; + +INSERT INTO `items` (name, label, `limit`) VALUES + ('bandage','Bandage', 20), + ('medikit','Medikit', 5) +; + +ALTER TABLE `users` + ADD `is_dead` TINYINT(1) NULL DEFAULT '0' +; diff --git a/esx_ambulancejob/locales/br.lua b/esx_ambulancejob/locales/br.lua new file mode 100644 index 00000000..be0dbc50 --- /dev/null +++ b/esx_ambulancejob/locales/br.lua @@ -0,0 +1,90 @@ +Locales['br'] = { + -- Cloakroom + ['cloakroom'] = 'Vestiário', + ['ems_clothes_civil'] = 'Roupa Normal', + ['ems_clothes_ems'] = 'Entrar como Socorrista', + -- Vehicles + ['ambulance'] = 'ambulance', + ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', + ['helicopter_buy'] = 'helicopter shop', + ['helicopter_garage'] = 'open garage', + ['helicopter_store'] = 'store helicopter in garage', + ['helicopter_garage_title'] = 'helicopter Garage', + ['helicopter_title'] = 'helicopter Actions', + ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', + ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', + ['garage_title'] = 'vehicle Actions', + ['garage_stored'] = 'stored', + ['garage_notstored'] = 'not in garage', + ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', + ['garage_has_stored'] = 'the vehicle has been stored in your garage', + ['garage_has_notstored'] = 'no nearby owned vehicles were found', + ['garage_notavailable'] = 'your vehicle is not stored in the garage.', + ['garage_blocked'] = 'there\'s no available spawn points!', + ['garage_empty'] = 'you dont have any vehicles in your garage.', + ['garage_released'] = 'your vehicle has been released from the garage.', + ['garage_store_nearby'] = 'there is no nearby vehicles.', + ['garage_storeditem'] = 'open garage', + ['garage_storeitem'] = 'store vehicle in garage', + ['garage_buyitem'] = 'vehicle shop', + ['shop_item'] = '$%s', + ['vehicleshop_title'] = 'vehicle Shop', + ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', + ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', + ['vehicleshop_money'] = 'you cannot afford that vehicle', + ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', + ['confirm_no'] = 'no', + ['confirm_yes'] = 'yes', + -- Action Menu + ['hospital'] = 'Hôspital', + ['revive_inprogress'] = 'Reanimação em andamento', + ['revive_complete'] = 'você ressuscitou ~y~%s~s~', + ['revive_complete_award'] = 'você ressuscitou ~y~%s~s~, ~g~$%s~s~', + ['heal_inprogress'] = 'you are healing!', + ['heal_complete'] = 'you have healed ~y~%s~s~', + ['no_players'] = 'Nenhum jogador nas proximidades', + ['no_vehicles'] = 'Sem veículos nas proximidades', + ['player_not_unconscious'] = 'Não está inconsciente', + ['player_not_conscious'] = 'that player is not conscious!', + -- Boss Menu + ['boss_actions'] = 'Menu Administração', + -- Misc + ['invalid_amount'] = '~r~Quantidade inválida', + ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', + ['deposit_amount'] = 'Quantidade inválida para deposito', + ['money_withdraw'] = 'Quantidade a ser retirada', + ['fast_travel'] = 'Aperte ~INPUT_CONTEXT~ para mover-se rapidamente.', + ['open_pharmacy'] = 'Aperte ~INPUT_CONTEXT~ para abrir a farmácia.', + ['pharmacy_menu_title'] = 'Farmácia', + ['pharmacy_take'] = 'tomar %s', + ['medikit'] = 'Seringa', + ['bandage'] = 'Vendagem', + ['max_item'] = 'você já carrega o suficiente sobre você.', + -- F6 Menu + ['ems_menu'] = 'Interação com cidadão', + ['ems_menu_title'] = 'Ambulância - Interação com cidadão', + ['ems_menu_revive'] = 'Reanimar', + ['ems_menu_putincar'] = 'Colocar no veiculo', + ['ems_menu_small'] = 'Curar pequenas feridas', + ['ems_menu_big'] = 'Tratando lesões graves', + -- Phone + ['alert_ambulance'] = 'Alerta Socorro', + -- Death + ['respawn_available_in'] = 'respawn available in ~b~%s minutes %s seconds~s~', + ['respawn_bleedout_in'] = 'you will bleed out in ~b~%s minutes %s seconds~s~\n', + ['respawn_bleedout_prompt'] = 'hold [~b~E~s~] to respawn', + ['respawn_bleedout_fine'] = 'hold [~b~E~s~] to respawn for ~g~$%s~s~', + ['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.', + ['distress_send'] = 'press [~b~G~s~] to send distress signal', + ['distress_sent'] = 'distress signal has been sent to available units!', + ['distress_message'] = 'medical attention required: unconscious citizen!', + ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.', + -- Revive + ['revive_help'] = 'reviver um jogador', + -- Item + ['used_medikit'] = 'você usou 1x Seringa', + ['used_bandage'] = 'você usou 1x Vendagem', + ['not_enough_medikit'] = 'Você não tem ~b~Seringa~s~.', + ['not_enough_bandage'] = 'Você não tem ~b~Vendagem~s~.', + ['healed'] = 'Você foi tratado.', +} diff --git a/esx_ambulancejob/locales/cs.lua b/esx_ambulancejob/locales/cs.lua new file mode 100644 index 00000000..48dc7cc2 --- /dev/null +++ b/esx_ambulancejob/locales/cs.lua @@ -0,0 +1,90 @@ +Locales['cs'] = { + -- Cloakroom + ['cloakroom'] = 'šatna', + ['ems_clothes_civil'] = 'civilní oblečení', + ['ems_clothes_ems'] = 'zdravotnické oblečení', + -- Vehicles + ['ambulance'] = 'ambulance', + ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', + ['helicopter_buy'] = 'helicopter shop', + ['helicopter_garage'] = 'open garage', + ['helicopter_store'] = 'store helicopter in garage', + ['helicopter_garage_title'] = 'helicopter Garage', + ['helicopter_title'] = 'helicopter Actions', + ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', + ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', + ['garage_title'] = 'vehicle Actions', + ['garage_stored'] = 'stored', + ['garage_notstored'] = 'not in garage', + ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', + ['garage_has_stored'] = 'the vehicle has been stored in your garage', + ['garage_has_notstored'] = 'no nearby owned vehicles were found', + ['garage_notavailable'] = 'your vehicle is not stored in the garage.', + ['garage_blocked'] = 'there\'s no available spawn points!', + ['garage_empty'] = 'you dont have any vehicles in your garage.', + ['garage_released'] = 'your vehicle has been released from the garage.', + ['garage_store_nearby'] = 'there is no nearby vehicles.', + ['garage_storeditem'] = 'open garage', + ['garage_storeitem'] = 'store vehicle in garage', + ['garage_buyitem'] = 'vehicle shop', + ['shop_item'] = '$%s', + ['vehicleshop_title'] = 'vehicle Shop', + ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', + ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', + ['vehicleshop_money'] = 'you cannot afford that vehicle', + ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', + ['confirm_no'] = 'no', + ['confirm_yes'] = 'yes', + -- Action Menu + ['hospital'] = 'nemocnice', + ['revive_inprogress'] = 'probíhá oživení!', + ['revive_complete'] = 'oživili jste ~y~%s~s~', + ['revive_complete_award'] = 'oživili jste ~y~%s~s~ a dostali jste ~g~$%s~s~!', + ['heal_inprogress'] = 'uzdravujete!', + ['heal_complete'] = 'uzdravili jste ~y~%s~s~', + ['no_players'] = 'v okolí není žádný hráč!', + ['no_vehicles'] = 'v okolí není žádné vozidlo', + ['player_not_unconscious'] = 'hráč není v bezvědomí!', + ['player_not_conscious'] = 'hráč je v bezvědomí!', + -- Boss Menu + ['boss_actions'] = 'akce šéfa', + -- Misc + ['invalid_amount'] = '~r~neplatná částka', + ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', + ['deposit_amount'] = 'částka vkladu', + ['money_withdraw'] = 'částka výběru', + ['fast_travel'] = 'stiskněte ~INPUT_CONTEXT~ k rychlému odcestování.', + ['open_pharmacy'] = 'stiskněte ~INPUT_CONTEXT~ k otevření lékárny.', + ['pharmacy_menu_title'] = 'lékárna', + ['pharmacy_take'] = 'vzít ~y~%s~s~', + ['medikit'] = 'lékarnička', + ['bandage'] = 'obvaz', + ['max_item'] = 'již nesete dostatek věcí.', + -- F6 Menu + ['ems_menu'] = 'Zdravotnické menu', + ['ems_menu_title'] = 'záchranka - Zdravotnické menu', + ['ems_menu_revive'] = 'oživit hráče', + ['ems_menu_putincar'] = 'naložit do vozidla', + ['ems_menu_small'] = 'ošetřit malé zranění', + ['ems_menu_big'] = 'ošetřit vážné zranění', + -- Phone + ['alert_ambulance'] = 'zdravotnický poplach', + -- Death + ['respawn_available_in'] = 'oživení dostupné za ~b~%s minut a %s sekund~s~\n', + ['respawn_bleedout_in'] = 'vykrvácíte za ~b~%s minut a %s sekund~s~\n', + ['respawn_bleedout_prompt'] = 'držte [~b~E~s~] pro respawn.', + ['respawn_now_fine'] = 'držte [~b~E~s~] pro oživení za ~g~$%s~s~', + ['respawn_bleedout_fine_msg'] = 'zaplatili jste ~r~$%s~s~ za respawn.', + ['distress_send'] = 'stiskněte [~b~G~s~] pro vyslání tísňového signálu', + ['distress_sent'] = 'tísňový signál byl vyslán dostupným jednotkám!', + ['distress_message'] = 'nutná lékařská péče: občan v bezvědomí!', + ['combatlog_message'] = 'byli jste násilně oživeni, protože jste předtím opustili server, když jste byli mrtví.', + -- Revive + ['revive_help'] = 'oživit hráče', + -- Item + ['used_medikit'] = 'použili jste ~y~1x~s~ lékarničku', + ['used_bandage'] = 'použili jste ~y~1x~s~ obvaz', + ['not_enough_medikit'] = 'nemáte ~b~medikit~s~.', + ['not_enough_bandage'] = 'nemáte~b~bandage~s~.', + ['healed'] = 'byli jste ošetřeni.', +} diff --git a/esx_ambulancejob/locales/en.lua b/esx_ambulancejob/locales/en.lua new file mode 100644 index 00000000..b13f48fe --- /dev/null +++ b/esx_ambulancejob/locales/en.lua @@ -0,0 +1,90 @@ +Locales['en'] = { + -- Cloakroom + ['cloakroom'] = 'locker Room', + ['ems_clothes_civil'] = 'civilian Clothes', + ['ems_clothes_ems'] = 'EMS Clothes', + -- Vehicles + ['ambulance'] = 'ambulance', + ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', + ['helicopter_buy'] = 'helicopter shop', + ['helicopter_garage'] = 'open garage', + ['helicopter_store'] = 'store helicopter in garage', + ['helicopter_garage_title'] = 'helicopter Garage', + ['helicopter_title'] = 'helicopter Actions', + ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', + ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', + ['garage_title'] = 'vehicle Actions', + ['garage_stored'] = 'stored', + ['garage_notstored'] = 'not in garage', + ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', + ['garage_has_stored'] = 'the vehicle has been stored in your garage', + ['garage_has_notstored'] = 'no nearby owned vehicles were found', + ['garage_notavailable'] = 'your vehicle is not stored in the garage.', + ['garage_blocked'] = 'there\'s no available spawn points!', + ['garage_empty'] = 'you dont have any vehicles in your garage.', + ['garage_released'] = 'your vehicle has been released from the garage.', + ['garage_store_nearby'] = 'there is no nearby vehicles.', + ['garage_storeditem'] = 'open garage', + ['garage_storeitem'] = 'store vehicle in garage', + ['garage_buyitem'] = 'vehicle shop', + ['shop_item'] = '$%s', + ['vehicleshop_title'] = 'vehicle Shop', + ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', + ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', + ['vehicleshop_money'] = 'you cannot afford that vehicle', + ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', + ['confirm_no'] = 'no', + ['confirm_yes'] = 'yes', + -- Action Menu + ['hospital'] = 'hospital', + ['revive_inprogress'] = 'a revive is in progress!', + ['revive_complete'] = 'you have revived ~y~%s~s~', + ['revive_complete_award'] = 'you have revived ~y~%s~s~ and earned ~g~$%s~s~!', + ['heal_inprogress'] = 'you are healing!', + ['heal_complete'] = 'you have healed ~y~%s~s~', + ['no_players'] = 'no players nearby', + ['no_vehicles'] = 'no vehicles nearby', + ['player_not_unconscious'] = 'that player is not unconscious!', + ['player_not_conscious'] = 'that player is not conscious!', + -- Boss Menu + ['boss_actions'] = 'boss Actions', + -- Misc + ['invalid_amount'] = '~r~Invalid amount', + ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', + ['deposit_amount'] = 'deposit Amount', + ['money_withdraw'] = 'amount withdrawn', + ['fast_travel'] = 'press ~INPUT_CONTEXT~ to fast travel.', + ['open_pharmacy'] = 'press ~INPUT_CONTEXT~ to open the pharmacy.', + ['pharmacy_menu_title'] = 'pharmacy', + ['pharmacy_take'] = 'take %s', + ['medikit'] = 'medikit', + ['bandage'] = 'bandage', + ['max_item'] = 'You are already carrying enough.', + -- F6 Menu + ['ems_menu'] = 'EMS Menu', + ['ems_menu_title'] = 'ambulance - EMS Menu', + ['ems_menu_revive'] = 'revive Player', + ['ems_menu_putincar'] = 'put in Vehicle', + ['ems_menu_small'] = 'heal small wounds', + ['ems_menu_big'] = 'treat serious injuries', + -- Phone + ['alert_ambulance'] = 'alert Ambulance', + -- Death + ['respawn_available_in'] = 'respawn available in ~b~%s minutes %s seconds~s~', + ['respawn_bleedout_in'] = 'you will bleed out in ~b~%s minutes %s seconds~s~\n', + ['respawn_bleedout_prompt'] = 'hold [~b~E~s~] to respawn', + ['respawn_bleedout_fine'] = 'hold [~b~E~s~] to respawn for ~g~$%s~s~', + ['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.', + ['distress_send'] = 'press [~b~G~s~] to send distress signal', + ['distress_sent'] = 'distress signal has been sent to available units!', + ['distress_message'] = 'medical attention required: unconscious citizen!', + ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.', + -- Revive + ['revive_help'] = 'revive a player', + -- Item + ['used_medikit'] = 'You have used ~y~1x~s~ medikit', + ['used_bandage'] = 'You have used ~y~1x~s~ bandage', + ['not_enough_medikit'] = 'You do not have ~b~medikit~s~.', + ['not_enough_bandage'] = 'You do not have ~b~bandage~s~.', + ['healed'] = 'you have been treated.', +} diff --git a/esx_ambulancejob/locales/es.lua b/esx_ambulancejob/locales/es.lua new file mode 100644 index 00000000..5b1e4ecb --- /dev/null +++ b/esx_ambulancejob/locales/es.lua @@ -0,0 +1,90 @@ +Locales['es'] = { + -- Cloakroom + ['cloakroom'] = 'Guardarropa', + ['ems_clothes_civil'] = 'Camiseta', + ['ems_clothes_ems'] = 'Equipo de ambulancia', + -- Vehicles + ['ambulance'] = 'ambulance', + ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', + ['helicopter_buy'] = 'helicopter shop', + ['helicopter_garage'] = 'open garage', + ['helicopter_store'] = 'store helicopter in garage', + ['helicopter_garage_title'] = 'helicopter Garage', + ['helicopter_title'] = 'helicopter Actions', + ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', + ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', + ['garage_title'] = 'vehicle Actions', + ['garage_stored'] = 'stored', + ['garage_notstored'] = 'not in garage', + ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', + ['garage_has_stored'] = 'the vehicle has been stored in your garage', + ['garage_has_notstored'] = 'no nearby owned vehicles were found', + ['garage_notavailable'] = 'your vehicle is not stored in the garage.', + ['garage_blocked'] = 'there\'s no available spawn points!', + ['garage_empty'] = 'you dont have any vehicles in your garage.', + ['garage_released'] = 'your vehicle has been released from the garage.', + ['garage_store_nearby'] = 'there is no nearby vehicles.', + ['garage_storeditem'] = 'open garage', + ['garage_storeitem'] = 'store vehicle in garage', + ['garage_buyitem'] = 'vehicle shop', + ['shop_item'] = '$%s', + ['vehicleshop_title'] = 'vehicle Shop', + ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', + ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', + ['vehicleshop_money'] = 'you cannot afford that vehicle', + ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', + ['confirm_no'] = 'no', + ['confirm_yes'] = 'yes', + -- Action Menu + ['hospital'] = 'hospital', + ['revive_inprogress'] = 'reanimación en curso', + ['revive_complete'] = 'has sido reanimado ~y~%s~s~', + ['revive_complete_award'] = 'has sido reanimado ~y~%s~s~, ~g~$%s~s~', + ['heal_inprogress'] = 'you are healing!', + ['heal_complete'] = 'you have healed ~y~%s~s~', + ['no_players'] = 'ningún jugador cerca', + ['no_vehicles'] = 'ningún vehículo cerca', + ['player_not_unconscious'] = 'n\'estás inconsciente', + ['player_not_conscious'] = 'that player is not conscious!', + -- Boss Menu + ['boss_actions'] = 'boss Actions', + -- Misc + ['invalid_amount'] = '~r~cantidad no válida', + ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', + ['deposit_amount'] = 'cantidad de fianza depositada', + ['money_withdraw'] = 'cantidad de fianza retirada', + ['fast_travel'] = 'Press ~INPUT_CONTEXT~ to fast travel.', + ['open_pharmacy'] = 'Press ~INPUT_CONTEXT~ to open the pharmacy.', + ['pharmacy_menu_title'] = 'Pharmacy', + ['pharmacy_take'] = 'take %s', + ['medikit'] = 'medikit', + ['bandage'] = 'bandage', + ['max_item'] = 'You are already carrying enough on yourself.', + -- F6 Menu + ['ems_menu'] = 'ayuda ciudadana', + ['ems_menu_title'] = 'ambulancia - Ayuda Ciudadana', + ['ems_menu_revive'] = 'reanimar', + ['ems_menu_putincar'] = 'meter en el vehículo', + ['ems_menu_small'] = 'heal small wounds', + ['ems_menu_big'] = 'treat serious injuries', + -- Phone + ['alert_ambulance'] = 'Alerta de ambulancia', + -- Death + ['respawn_available_in'] = 'respawn available in ~b~%s minutes %s seconds~s~', + ['respawn_bleedout_in'] = 'you will bleed out in ~b~%s minutes %s seconds~s~\n', + ['respawn_bleedout_prompt'] = 'hold [~b~E~s~] to respawn', + ['respawn_bleedout_fine'] = 'hold [~b~E~s~] to respawn for ~g~$%s~s~', + ['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.', + ['distress_send'] = 'press [~b~G~s~] to send distress signal', + ['distress_sent'] = 'distress signal has been sent to available units!', + ['distress_message'] = 'medical attention required: unconscious citizen!', + ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.', + -- Revive + ['revive_help'] = 'reviver un jugador', + -- Item + ['used_medikit'] = 'You have used ~y~1x~s~ medikit', + ['used_bandage'] = 'You have used ~y~1x~s~ bandage', + ['not_enough_medikit'] = 'You do not have ~b~medikit~s~.', + ['not_enough_bandage'] = 'You do not have ~b~bandage~s~.', + ['healed'] = 'you have been treated.', +} diff --git a/esx_ambulancejob/locales/fi.lua b/esx_ambulancejob/locales/fi.lua new file mode 100644 index 00000000..ac99fc65 --- /dev/null +++ b/esx_ambulancejob/locales/fi.lua @@ -0,0 +1,90 @@ +Locales['fi'] = { + -- Cloakroom + ['cloakroom'] = 'Vaatelokero', + ['ems_clothes_civil'] = 'Siviilikamppeet', + ['ems_clothes_ems'] = 'Työkamppeet', + -- Vehicles + ['ambulance'] = 'ambulance', + ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', + ['helicopter_buy'] = 'helicopter shop', + ['helicopter_garage'] = 'open garage', + ['helicopter_store'] = 'store helicopter in garage', + ['helicopter_garage_title'] = 'helicopter Garage', + ['helicopter_title'] = 'helicopter Actions', + ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', + ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', + ['garage_title'] = 'vehicle Actions', + ['garage_stored'] = 'stored', + ['garage_notstored'] = 'not in garage', + ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', + ['garage_has_stored'] = 'the vehicle has been stored in your garage', + ['garage_has_notstored'] = 'no nearby owned vehicles were found', + ['garage_notavailable'] = 'your vehicle is not stored in the garage.', + ['garage_blocked'] = 'there\'s no available spawn points!', + ['garage_empty'] = 'you dont have any vehicles in your garage.', + ['garage_released'] = 'your vehicle has been released from the garage.', + ['garage_store_nearby'] = 'there is no nearby vehicles.', + ['garage_storeditem'] = 'open garage', + ['garage_storeitem'] = 'store vehicle in garage', + ['garage_buyitem'] = 'vehicle shop', + ['shop_item'] = '$%s', + ['vehicleshop_title'] = 'vehicle Shop', + ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', + ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', + ['vehicleshop_money'] = 'you cannot afford that vehicle', + ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', + ['confirm_no'] = 'no', + ['confirm_yes'] = 'yes', + -- Action Menu + ['hospital'] = 'sairaala', + ['revive_inprogress'] = 'elvytys on menossa!', + ['revive_complete'] = 'sinä elvytit henkilön ~y~%s~s~', + ['revive_complete_award'] = 'sinä elvytit henkilön ~y~%s~s~ ja tienasit ~g~$%s~s~!', + ['heal_inprogress'] = 'sinä olet parantamassa!', + ['heal_complete'] = 'sinä paransit henkilön ~y~%s~s~', + ['no_players'] = 'ei pelaajia lähettyvillä', + ['no_vehicles'] = 'ei ajoneuvoja lähettyvillä', + ['player_not_unconscious'] = 'tämä pelaaja ei ole tajuton!', + ['player_not_conscious'] = 'tämä pelaaja ei ole tajuissaan!', + -- Boss Menu + ['boss_actions'] = 'pomovalikko', + -- Misc + ['invalid_amount'] = '~r~Virheellinen summa', + ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', + ['deposit_amount'] = 'talletettava summa', + ['money_withdraw'] = 'nostettava summa', + ['fast_travel'] = 'paina ~INPUT_CONTEXT~ liikkuaksesi nopeasti kerrosten välillä', + ['open_pharmacy'] = 'paina ~INPUT_CONTEXT~ avataksesi lääkekaappi', + ['pharmacy_menu_title'] = 'lääkekaappi', + ['pharmacy_take'] = 'ota %s', + ['medikit'] = 'ensiapupakkauksia', + ['bandage'] = 'sideharsoja', + ['max_item'] = 'sinulla on jo tarpeeksi mukana', + -- F6 Menu + ['ems_menu'] = 'ensihoito menu', + ['ems_menu_title'] = 'ensihoito - Siviilin kanssakäyminen', + ['ems_menu_revive'] = 'elvytä', + ['ems_menu_putincar'] = 'Laita ajoneuvoon', + ['ems_menu_small'] = 'hoida pieniä haavoja', + ['ems_menu_big'] = 'hoida isoja haavoja', + -- Phone + ['alert_ambulance'] = 'hälyytys Ensihoidolle', + -- Death + ['respawn_available_in'] = 'respawn available in ~b~%s minutes %s seconds~s~', + ['respawn_bleedout_in'] = 'you will bleed out in ~b~%s minutes %s seconds~s~\n', + ['respawn_bleedout_prompt'] = 'hold [~b~E~s~] to respawn', + ['respawn_bleedout_fine'] = 'hold [~b~E~s~] to respawn for ~g~$%s~s~', + ['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.', + ['distress_send'] = 'press [~b~G~s~] to send distress signal', + ['distress_sent'] = 'distress signal has been sent to available units!', + ['distress_message'] = 'medical attention required: unconscious citizen!', + ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.', + -- Revive + ['revive_help'] = 'elvytä pelaaja', + -- Item + ['used_medikit'] = 'sinä käytit ensiapupakkauksen', + ['used_bandage'] = 'sinä käytit sideharsoja', + ['not_enough_medikit'] = 'ei tarpeeksi ~b~ensiapupakkauksia~s~.', + ['not_enough_bandage'] = 'ei tarpeeksi ~b~sideharsoja~s~.', + ['healed'] = 'sinua parannettiin', +} diff --git a/esx_ambulancejob/locales/fr.lua b/esx_ambulancejob/locales/fr.lua new file mode 100644 index 00000000..b56c17f7 --- /dev/null +++ b/esx_ambulancejob/locales/fr.lua @@ -0,0 +1,90 @@ +Locales['fr'] = { + -- Cloakroom + ['cloakroom'] = 'Vestiaire', + ['ems_clothes_civil'] = 'Tenue Civil', + ['ems_clothes_ems'] = 'Tenue Ambulancier', + -- Vehicles + ['ambulance'] = 'ambulance', + ['helicopter_prompt'] = 'appuyez sur ~INPUT_CONTEXT~ pour accéder aux ~y~Actions de l\'hélicoptère~s~.', + ['helicopter_buy'] = 'magasin hélicoptère', + ['helicopter_garage'] = 'ouvrir le garage', + ['helicopter_store'] = 'garer l\'hélicoptère dans le garage', + ['helicopter_garage_title'] = 'garage hélicoptère', + ['helicopter_title'] = 'actions hélicoptère', + ['helicopter_notauthorized'] = 'vous n\'êtes pas autorisé à acheter un hélicoptère.', + ['garage_prompt'] = 'appuyez sur ~INPUT_CONTEXT~ pour accéder aux ~y~Actions des véhciules~s~.', + ['garage_title'] = 'actions véhicules', + ['garage_stored'] = 'rangé', + ['garage_notstored'] = 'en dehors du garage', + ['garage_storing'] = 'tentative de suppression du véhicule, assurez-vous que personne ne soit autour.', + ['garage_has_stored'] = 'le véhicule a bien été rangé dans le garage', + ['garage_has_notstored'] = 'aucun véhicule dans le garage', + ['garage_notavailable'] = 'votre véhicule n\'est pas rangé dans le garage.', + ['garage_blocked'] = 'la sortie du garage est obstruée!', + ['garage_empty'] = 'vous n\'avez aucun véhicule dans le garage.', + ['garage_released'] = 'votre véhicule a été sorti.', + ['garage_store_nearby'] = 'aucun véhicule a proximité.', + ['garage_storeditem'] = 'ouvrir le garage', + ['garage_storeitem'] = 'ranger le véhicule', + ['garage_buyitem'] = 'magasin véhicule', + ['shop_item'] = '$%s', + ['vehicleshop_title'] = 'magasin véhicule', + ['vehicleshop_confirm'] = 'voulez-vous acheter ce véhicule?', + ['vehicleshop_bought'] = 'vous avez acheté ~y~%s~s~ pour ~r~$%s~s~', + ['vehicleshop_money'] = 'vous ne pouvez pas acheter ce véhicule', + ['vehicleshop_awaiting_model'] = 'le véhicule est actuellement en ~g~PRÉPARATION~s~ veuillez patienter', + ['confirm_no'] = 'non', + ['confirm_yes'] = 'oui', + -- Action Menu + ['hospital'] = 'hôpital', + ['revive_inprogress'] = 'réanimation en cours', + ['revive_complete'] = 'vous avez réanimé ~y~%s~s~', + ['revive_complete_award'] = 'vous avez réanimé ~y~%s~s~, ~g~$%s~s~', + ['heal_inprogress'] = 'vous soignez...', + ['heal_complete'] = 'vous avez soigné ~y~%s~s~', + ['no_players'] = 'aucun joueur à proximité', + ['no_vehicles'] = 'aucun véhicule à proximité', + ['player_not_unconscious'] = 'n\'est pas inconscient', + ['player_not_conscious'] = 'Cette personne est inconsciente!', + -- Boss Menu + ['boss_actions'] = 'action Patron', + -- Misc + ['invalid_amount'] = '~r~montant invalide', + ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', + ['deposit_amount'] = 'montant du dépôt', + ['money_withdraw'] = 'montant du retrait', + ['fast_travel'] = 'appuyez sur ~INPUT_CONTEXT~ pour vous déplacer rapidement.', + ['open_pharmacy'] = 'appuyez sur ~INPUT_CONTEXT~ pour ouvrir la pharmacie.', + ['pharmacy_menu_title'] = 'Pharmacie', + ['pharmacy_take'] = 'prendre %s', + ['medikit'] = 'kit de soin', + ['bandage'] = 'bandage', + ['max_item'] = 'vous en portez déjà assez sur vous.', + -- F6 Menu + ['ems_menu'] = 'interaction citoyen', + ['ems_menu_title'] = 'ambulance - Interactions Citoyen', + ['ems_menu_revive'] = 'réanimer', + ['ems_menu_putincar'] = 'mettre dans véhicule', + ['ems_menu_small'] = 'soigner petites blessures', + ['ems_menu_big'] = 'soigner blessures graves', + -- Phone + ['alert_ambulance'] = 'alerte Ambulance', + -- Death + ['respawn_available_in'] = 'réanimation possible dans ~b~%s minutes %s secondes~s~', + ['respawn_bleedout_in'] = 'vous allez souffrir d\'une hémorragie dans ~b~%s minutes %s secondes~s~\n', + ['respawn_bleedout_prompt'] = 'maintenez [~b~E~s~] pour être réanimé', + ['respawn_bleedout_fine'] = 'maintenez [~b~E~s~] pour être réanimé pour ~g~$%s~s~', + ['respawn_bleedout_fine_msg'] = 'vous avez payé ~r~$%s~s~ pour être réanimer.', + ['distress_send'] = 'appuyez sur [~b~G~s~] pour envoyer un signal de détresse', + ['distress_sent'] = 'un signal a été envoyé à toutes les unités disponibles!', + ['distress_message'] = 'interventtion requise: citoyen inconscient!', + ['combatlog_message'] = 'vous avez été réanimé de force car vous avez quitté le serveur.', + -- Revive + ['revive_help'] = 'relancer un joueur', + -- Item + ['used_medikit'] = 'vous avez utilisé 1x kit de soin', + ['used_bandage'] = 'vous avez utilisé 1x bandage', + ['not_enough_medikit'] = 'vous n\'avez pas de ~b~kit de soin~s~.', + ['not_enough_bandage'] = 'vous n\'avez pas de ~b~bandage~s~.', + ['healed'] = 'vous avez été soigné.', +} diff --git a/esx_ambulancejob/locales/pl.lua b/esx_ambulancejob/locales/pl.lua new file mode 100644 index 00000000..61778ccc --- /dev/null +++ b/esx_ambulancejob/locales/pl.lua @@ -0,0 +1,90 @@ +Locales['pl'] = { + -- Cloakroom + ['cloakroom'] = 'szatnia', + ['ems_clothes_civil'] = 'ubrania cywilne', + ['ems_clothes_ems'] = 'ubrania EMS', + -- Vehicles + ['ambulance'] = 'ambulance', + ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', + ['helicopter_buy'] = 'helicopter shop', + ['helicopter_garage'] = 'open garage', + ['helicopter_store'] = 'store helicopter in garage', + ['helicopter_garage_title'] = 'helicopter Garage', + ['helicopter_title'] = 'helicopter Actions', + ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', + ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', + ['garage_title'] = 'vehicle Actions', + ['garage_stored'] = 'stored', + ['garage_notstored'] = 'not in garage', + ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', + ['garage_has_stored'] = 'the vehicle has been stored in your garage', + ['garage_has_notstored'] = 'no nearby owned vehicles were found', + ['garage_notavailable'] = 'your vehicle is not stored in the garage.', + ['garage_blocked'] = 'there\'s no available spawn points!', + ['garage_empty'] = 'you dont have any vehicles in your garage.', + ['garage_released'] = 'your vehicle has been released from the garage.', + ['garage_store_nearby'] = 'there is no nearby vehicles.', + ['garage_storeditem'] = 'open garage', + ['garage_storeitem'] = 'store vehicle in garage', + ['garage_buyitem'] = 'vehicle shop', + ['shop_item'] = '$%s', + ['vehicleshop_title'] = 'vehicle Shop', + ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', + ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', + ['vehicleshop_money'] = 'you cannot afford that vehicle', + ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', + ['confirm_no'] = 'no', + ['confirm_yes'] = 'yes', + -- Action Menu + ['hospital'] = 'szpital', + ['revive_inprogress'] = 'trwa wskrzeszenie', + ['revive_complete'] = 'zostałeś wskrzeszony ~y~%s~s~', + ['revive_complete_award'] = 'zostałeś wskrzeszony ~y~%s~s~ i zarobiono ~g~$%s~s~!', + ['heal_inprogress'] = 'leczysz!', + ['heal_complete'] = 'zostałeś uleczony ~y~%s~s~', + ['no_players'] = 'brak graczy w pobliżu', + ['no_vehicles'] = 'brak pojazdów w pobliżu', + ['player_not_unconscious'] = 'ten gracz nie jest nieprzytomny!', + ['player_not_conscious'] = 'ten gracz nie jest świadomy!', + -- Boss Menu + ['boss_actions'] = 'akcje szefa', + -- Misc + ['invalid_amount'] = '~r~Nieprawidłowa kwota', + ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', + ['deposit_amount'] = 'kwota depozytu', + ['money_withdraw'] = 'wycofana kwota', + ['fast_travel'] = 'naciśnij na ~INPUT_CONTEXT~ do szybkiej podróży.', + ['open_pharmacy'] = 'naciśnij na ~INPUT_CONTEXT~ aby otworzyć aptekę', + ['pharmacy_menu_title'] = 'apteka', + ['pharmacy_take'] = 'weź %s', + ['medikit'] = 'apteczka', + ['bandage'] = 'bandaż', + ['max_item'] = 'już masz na sobie dość.', + -- F6 Menu + ['ems_menu'] = 'menu EMS', + ['ems_menu_title'] = 'eMS Menu - Ambulans', + ['ems_menu_revive'] = 'ożyw gracza', + ['ems_menu_putincar'] = 'umieścić w pojeździe', + ['ems_menu_small'] = 'ulecz małe rany', + ['ems_menu_big'] = 'ulecz poważne obrażenia', + -- Phone + ['alert_ambulance'] = 'wezwij ambulans', + -- Death + ['respawn_available_in'] = 'respawn available in ~b~%s minutes %s seconds~s~', + ['respawn_bleedout_in'] = 'you will bleed out in ~b~%s minutes %s seconds~s~\n', + ['respawn_bleedout_prompt'] = 'hold [~b~E~s~] to respawn', + ['respawn_bleedout_fine'] = 'hold [~b~E~s~] to respawn for ~g~$%s~s~', + ['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.', + ['distress_send'] = 'press [~b~G~s~] to send distress signal', + ['distress_sent'] = 'distress signal has been sent to available units!', + ['distress_message'] = 'medical attention required: unconscious citizen!', + ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.', + -- Revive + ['revive_help'] = 'ożyw gracza', + -- Item + ['used_medikit'] = 'użyłeś 1x Apteczki', + ['used_bandage'] = 'użyłeś 1x Bandaża', + ['not_enough_medikit'] = 'nie posiadasz ~b~apteczki~s~.', + ['not_enough_bandage'] = 'nie posiadasz ~b~bandaża~s~.', + ['healed'] = 'zostałeś potraktowany', +} diff --git a/esx_ambulancejob/locales/sv.lua b/esx_ambulancejob/locales/sv.lua new file mode 100644 index 00000000..0693cfd1 --- /dev/null +++ b/esx_ambulancejob/locales/sv.lua @@ -0,0 +1,90 @@ +Locales['sv'] = { + -- Cloakroom + ['cloakroom'] = 'omklädnignsrum', + ['ems_clothes_civil'] = 'civilkläder', + ['ems_clothes_ems'] = 'ambulanskläder', + -- Vehicles + ['ambulance'] = 'ambulance', + ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', + ['helicopter_buy'] = 'helicopter shop', + ['helicopter_garage'] = 'open garage', + ['helicopter_store'] = 'store helicopter in garage', + ['helicopter_garage_title'] = 'helicopter Garage', + ['helicopter_title'] = 'helicopter Actions', + ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', + ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', + ['garage_title'] = 'vehicle Actions', + ['garage_stored'] = 'stored', + ['garage_notstored'] = 'not in garage', + ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', + ['garage_has_stored'] = 'the vehicle has been stored in your garage', + ['garage_has_notstored'] = 'no nearby owned vehicles were found', + ['garage_notavailable'] = 'your vehicle is not stored in the garage.', + ['garage_blocked'] = 'there\'s no available spawn points!', + ['garage_empty'] = 'you dont have any vehicles in your garage.', + ['garage_released'] = 'your vehicle has been released from the garage.', + ['garage_store_nearby'] = 'there is no nearby vehicles.', + ['garage_storeditem'] = 'open garage', + ['garage_storeitem'] = 'store vehicle in garage', + ['garage_buyitem'] = 'vehicle shop', + ['shop_item'] = '%s SEK', + ['vehicleshop_title'] = 'vehicle Shop', + ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', + ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', + ['vehicleshop_money'] = 'you cannot afford that vehicle', + ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', + ['confirm_no'] = 'no', + ['confirm_yes'] = 'yes', + -- Action Menu + ['hospital'] = 'sjukhus', + ['revive_inprogress'] = 'en återupplivning har börjats', + ['revive_complete'] = 'du har återupplivat ~y~%s~s~, bra jobbat!', + ['revive_complete_award'] = 'du har återupplivat ~y~%s~s~ och tjärnat ~g~%s SEK~s~ för dina tjänster, bra jobbat!', + ['heal_inprogress'] = 'du behandlar patienten!', + ['heal_complete'] = 'du har behandlat ~y~%s~s~', + ['no_players'] = 'det finns inga spelare i närheten!', + ['no_vehicles'] = 'det finns inget fordon i närheten!', + ['player_not_unconscious'] = 'spelaren är inte medvetslös!', + ['player_not_conscious'] = 'spelaren är inte vid medvetande!', + -- Boss Menu + ['boss_actions'] = 'chef meny', + -- Misc + ['invalid_amount'] = '~r~Ogiltig mängd', + ['actions_prompt'] = 'tryck ~INPUT_CONTEXT~ för att öppna menyn.', + ['deposit_amount'] = 'mängd att sätta in', + ['money_withdraw'] = 'mängd att ta ut', + ['fast_travel'] = 'tryck på ~INPUT_CONTEXT~ för att snabbresa.', + ['open_pharmacy'] = 'tryck på ~INPUT_CONTEXT~ för att öppna apoteket.', + ['pharmacy_menu_title'] = 'apotek', + ['pharmacy_take'] = 'ta %s', + ['medikit'] = 'medicinkit', + ['bandage'] = 'bandage', + ['max_item'] = 'du har redan tillräckligt mycket på dig.', + -- F6 Menu + ['ems_menu'] = 'ambulansmeny', + ['ems_menu_title'] = 'ambulansmeny', + ['ems_menu_revive'] = 'återuppliva spelare', + ['ems_menu_putincar'] = 'sätt i fordon', + ['ems_menu_small'] = 'behandla mindre skador', + ['ems_menu_big'] = 'behandla svåra skador', + -- Phone + ['alert_ambulance'] = 'ambulanssamtal', + -- Death + ['respawn_available_in'] = 'respawn tillgänglig om ~b~%s:%s~s~', + ['respawn_bleedout_in'] = 'du kommer att blöda ut om ~b~%s:%s~s~\n', + ['respawn_bleedout_prompt'] = 'håll [~b~E~s~] för att respawna', + ['respawn_bleedout_fine'] = 'håll [~b~E~s~] för att respawna, kostar ~g~%s SEK~s~', + ['respawn_bleedout_fine_msg'] = 'du betalade ~r~%s SEK~s~ för att respawna.', + ['distress_send'] = 'tryck ~b~[G]~s~ för att skicka nödsignal', + ['distress_sent'] = 'nödsignal har skickats till samtliga enheter!', + ['distress_message'] = 'läkarvård krävs: medvetslös medborgare!', + ['combatlog_message'] = 'du har force-respawnats på grund av att du lämnat servern medans du var död', + -- Revive + ['revive_help'] = 'återuppliva en spelare', + -- Item + ['used_medikit'] = 'du har använt ~y~1x~s~ ~b~Medecinkit~s~', + ['used_bandage'] = 'du har använt ~y~1x~s~ ~b~Bandage~s~', + ['not_enough_medikit'] = 'du har inget ~b~Medecinkit~s~.', + ['not_enough_bandage'] = 'du har inget ~b~Bandage~s~.', + ['healed'] = 'dina skador har blivit behandlade.', +} diff --git a/esx_ambulancejob/localization/cs_esx_ambulancejob.sql b/esx_ambulancejob/localization/cs_esx_ambulancejob.sql new file mode 100644 index 00000000..a8af1939 --- /dev/null +++ b/esx_ambulancejob/localization/cs_esx_ambulancejob.sql @@ -0,0 +1,33 @@ +USE `essentialmode`; + +INSERT INTO `addon_account` (name, label, shared) VALUES + ('society_ambulance', 'Záchranka', 1) +; + +INSERT INTO `addon_inventory` (name, label, shared) VALUES + ('society_ambulance', 'Záchranka', 1) +; + +INSERT INTO `datastore` (name, label, shared) VALUES + ('society_ambulance', 'Záchranka', 1) +; + +INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES + ('ambulance',0,'ambulance','Zdravotník',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',1,'doctor','Doktor',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',2,'chief_doctor','Primář',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',3,'boss','Chirurg',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') +; + +INSERT INTO `jobs` (name, label) VALUES + ('ambulance','Záchranka') +; + +INSERT INTO `items` (name, label, `limit`) VALUES + ('bandage','Obvaz', 20), + ('medikit','Lékarnička', 5) +; + +ALTER TABLE `users` + ADD `is_dead` TINYINT(1) NULL DEFAULT '0' +; diff --git a/esx_ambulancejob/localization/de_esx_ambulancejob.sql b/esx_ambulancejob/localization/de_esx_ambulancejob.sql new file mode 100644 index 00000000..0ebf079d --- /dev/null +++ b/esx_ambulancejob/localization/de_esx_ambulancejob.sql @@ -0,0 +1,33 @@ +USE `essentialmode`; + +INSERT INTO `addon_account` (name, label, shared) VALUES + ('society_ambulance', 'Notdienst', 1) +; + +INSERT INTO `addon_inventory` (name, label, shared) VALUES + ('society_ambulance', 'Ambulance', 1) +; + +INSERT INTO `datastore` (name, label, shared) VALUES + ('society_ambulance', 'Ambulance', 1) +; + +INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES + ('ambulance',0,'ambulance','Sanitäter',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',1,'doctor','Arzt',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',2,'chief_doctor','Chefarzt',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',3,'boss','Chirurg',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') +; + +INSERT INTO `jobs` (name, label) VALUES + ('ambulance','Notdienst') +; + +INSERT INTO `items` (name, label, `limit`) VALUES + ('bandage','Bandage', 20), + ('medikit','Medikit', 5) +; + +ALTER TABLE `users` + ADD `is_dead` TINYINT(1) NULL DEFAULT '0' +; diff --git a/esx_ambulancejob/localization/en_esx_ambulancejob.sql b/esx_ambulancejob/localization/en_esx_ambulancejob.sql new file mode 100644 index 00000000..6bb4ecf1 --- /dev/null +++ b/esx_ambulancejob/localization/en_esx_ambulancejob.sql @@ -0,0 +1,33 @@ +USE `essentialmode`; + +INSERT INTO `addon_account` (name, label, shared) VALUES + ('society_ambulance', 'EMS', 1) +; + +INSERT INTO `addon_inventory` (name, label, shared) VALUES + ('society_ambulance', 'EMS', 1) +; + +INSERT INTO `datastore` (name, label, shared) VALUES + ('society_ambulance', 'EMS', 1) +; + +INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES + ('ambulance',0,'ambulance','Jr. EMT',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',1,'doctor','EMT',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',2,'chief_doctor','Sr. EMT',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',3,'boss','EMT Supervisor',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') +; + +INSERT INTO `jobs` (name, label) VALUES + ('ambulance','EMS') +; + +INSERT INTO `items` (name, label, `limit`) VALUES + ('bandage','Bandage', 20), + ('medikit','Medikit', 5) +; + +ALTER TABLE `users` + ADD `is_dead` TINYINT(1) NULL DEFAULT '0' +; diff --git a/esx_ambulancejob/localization/fi_esx_ambulancejob.sql b/esx_ambulancejob/localization/fi_esx_ambulancejob.sql new file mode 100644 index 00000000..7c001e0d --- /dev/null +++ b/esx_ambulancejob/localization/fi_esx_ambulancejob.sql @@ -0,0 +1,33 @@ +USE `essentialmode`; + +INSERT INTO `addon_account` (name, label, shared) VALUES + ('society_ambulance', 'Ensihoito', 1) +; + +INSERT INTO `addon_inventory` (name, label, shared) VALUES + ('society_ambulance', 'Ensihoito', 1) +; + +INSERT INTO `datastore` (name, label, shared) VALUES + ('society_ambulance', 'Ensihoito', 1) +; + +INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES + ('ambulance',0,'ambulance','Ensihoitaja',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',1,'doctor','Lääkäri',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',2,'chief_doctor','Yli-lääkäri',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',3,'boss','Kirurgi',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') +; + +INSERT INTO `jobs` (name, label) VALUES + ('ambulance','Ensihoito') +; + +INSERT INTO `items` (name, label, `limit`) VALUES + ('bandage','Sideharso', 20), + ('medikit','Ensiapupakkaus', 5) +; + +ALTER TABLE `users` + ADD `is_dead` TINYINT(1) NULL DEFAULT '0' +; diff --git a/esx_ambulancejob/localization/pl_esx_ambulancejob.sql b/esx_ambulancejob/localization/pl_esx_ambulancejob.sql new file mode 100644 index 00000000..c3715181 --- /dev/null +++ b/esx_ambulancejob/localization/pl_esx_ambulancejob.sql @@ -0,0 +1,33 @@ +USE `essentialmode`; + +INSERT INTO `addon_account` (name, label, shared) VALUES + ('society_ambulance', 'Ambulance', 1) +; + +INSERT INTO `addon_inventory` (name, label, shared) VALUES + ('society_ambulance', 'Ambulance', 1) +; + +INSERT INTO `datastore` (name, label, shared) VALUES + ('society_ambulance', 'Pogotowie ratunkowe', 1) +; + +INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES + ('ambulance',0,'ambulance','Ratownik',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',1,'doctor','Lekarz',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',2,'chief_doctor','Chirurg',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), + ('ambulance',3,'boss','Ordynator',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') +; + +INSERT INTO `jobs` (name, label) VALUES + ('ambulance','Pogotowie ratunkowe') +; + +INSERT INTO `items` (name, label, `limit`) VALUES + ('bandage','Bandaż', 20), + ('medikit','Defibrylator', 5) +; + +ALTER TABLE `users` + ADD `is_dead` TINYINT(1) NULL DEFAULT '0' +; diff --git a/esx_ambulancejob/server/main.lua b/esx_ambulancejob/server/main.lua new file mode 100644 index 00000000..0f5b78d9 --- /dev/null +++ b/esx_ambulancejob/server/main.lua @@ -0,0 +1,306 @@ +ESX = nil +local playersHealing = {} + +TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + +RegisterServerEvent('esx_ambulancejob:revive') +AddEventHandler('esx_ambulancejob:revive', function(target) + local xPlayer = ESX.GetPlayerFromId(source) + + if xPlayer.job.name == 'ambulance' then + xPlayer.addMoney(Config.ReviveReward) + TriggerClientEvent('esx_ambulancejob:revive', target) + else + print(('esx_ambulancejob: %s attempted to revive!'):format(xPlayer.identifier)) + end +end) + +RegisterServerEvent('esx_ambulancejob:heal') +AddEventHandler('esx_ambulancejob:heal', function(target, type) + local xPlayer = ESX.GetPlayerFromId(source) + + if xPlayer.job.name == 'ambulance' then + TriggerClientEvent('esx_ambulancejob:heal', target, type) + else + print(('esx_ambulancejob: %s attempted to heal!'):format(xPlayer.identifier)) + end +end) + +RegisterServerEvent('esx_ambulancejob:putInVehicle') +AddEventHandler('esx_ambulancejob:putInVehicle', function(target) + local xPlayer = ESX.GetPlayerFromId(source) + + if xPlayer.job.name == 'ambulance' then + TriggerClientEvent('esx_ambulancejob:putInVehicle', target) + else + print(('esx_ambulancejob: %s attempted to put in vehicle!'):format(xPlayer.identifier)) + end +end) + +TriggerEvent('esx_phone:registerNumber', 'ambulance', _U('alert_ambulance'), true, true) + +TriggerEvent('esx_society:registerSociety', 'ambulance', 'Ambulance', 'society_ambulance', 'society_ambulance', 'society_ambulance', {type = 'public'}) + +ESX.RegisterServerCallback('esx_ambulancejob:removeItemsAfterRPDeath', function(source, cb) + local xPlayer = ESX.GetPlayerFromId(source) + + if Config.RemoveCashAfterRPDeath then + if xPlayer.getMoney() > 0 then + xPlayer.removeMoney(xPlayer.getMoney()) + end + + if xPlayer.getAccount('black_money').money > 0 then + xPlayer.setAccountMoney('black_money', 0) + end + end + + if Config.RemoveItemsAfterRPDeath then + for i=1, #xPlayer.inventory, 1 do + if xPlayer.inventory[i].count > 0 then + xPlayer.setInventoryItem(xPlayer.inventory[i].name, 0) + end + end + end + + local playerLoadout = {} + if Config.RemoveWeaponsAfterRPDeath then + for i=1, #xPlayer.loadout, 1 do + xPlayer.removeWeapon(xPlayer.loadout[i].name) + end + else -- save weapons & restore em' since spawnmanager removes them + for i=1, #xPlayer.loadout, 1 do + table.insert(playerLoadout, xPlayer.loadout[i]) + end + + -- give back wepaons after a couple of seconds + Citizen.CreateThread(function() + Citizen.Wait(5000) + for i=1, #playerLoadout, 1 do + if playerLoadout[i].label ~= nil then + xPlayer.addWeapon(playerLoadout[i].name, playerLoadout[i].ammo) + end + end + end) + end + + cb() +end) + +if Config.EarlyRespawnFine then + ESX.RegisterServerCallback('esx_ambulancejob:checkBalance', function(source, cb) + local xPlayer = ESX.GetPlayerFromId(source) + local bankBalance = xPlayer.getAccount('bank').money + + cb(bankBalance >= Config.EarlyRespawnFineAmount) + end) + + RegisterServerEvent('esx_ambulancejob:payFine') + AddEventHandler('esx_ambulancejob:payFine', function() + local xPlayer = ESX.GetPlayerFromId(source) + local fineAmount = Config.EarlyRespawnFineAmount + + TriggerClientEvent('esx:showNotification', xPlayer.source, _U('respawn_bleedout_fine_msg', ESX.Math.GroupDigits(fineAmount))) + xPlayer.removeAccountMoney('bank', fineAmount) + end) +end + +ESX.RegisterServerCallback('esx_ambulancejob:getItemAmount', function(source, cb, item) + local xPlayer = ESX.GetPlayerFromId(source) + local quantity = xPlayer.getInventoryItem(item).count + + cb(quantity) +end) + +ESX.RegisterServerCallback('esx_ambulancejob:buyJobVehicle', function(source, cb, vehicleProps, type) + local xPlayer = ESX.GetPlayerFromId(source) + local price = getPriceFromHash(vehicleProps.model, xPlayer.job.grade_name, type) + + -- vehicle model not found + if price == 0 then + print(('esx_ambulancejob: %s attempted to exploit the shop! (invalid vehicle model)'):format(xPlayer.identifier)) + cb(false) + else + if xPlayer.getMoney() >= price then + xPlayer.removeMoney(price) + + MySQL.Async.execute('INSERT INTO owned_vehicles (owner, vehicle, plate, type, job, `stored`) VALUES (@owner, @vehicle, @plate, @type, @job, @stored)', { + ['@owner'] = xPlayer.identifier, + ['@vehicle'] = json.encode(vehicleProps), + ['@plate'] = vehicleProps.plate, + ['@type'] = type, + ['@job'] = xPlayer.job.name, + ['@stored'] = true + }, function (rowsChanged) + cb(true) + end) + else + cb(false) + end + end +end) + +ESX.RegisterServerCallback('esx_ambulancejob:storeNearbyVehicle', function(source, cb, nearbyVehicles) + local xPlayer = ESX.GetPlayerFromId(source) + local foundPlate, foundNum + + for k,v in ipairs(nearbyVehicles) do + local result = MySQL.Sync.fetchAll('SELECT plate FROM owned_vehicles WHERE owner = @owner AND plate = @plate AND job = @job', { + ['@owner'] = xPlayer.identifier, + ['@plate'] = v.plate, + ['@job'] = xPlayer.job.name + }) + + if result[1] then + foundPlate, foundNum = result[1].plate, k + break + end + end + + if not foundPlate then + cb(false) + else + MySQL.Async.execute('UPDATE owned_vehicles SET `stored` = true WHERE owner = @owner AND plate = @plate AND job = @job', { + ['@owner'] = xPlayer.identifier, + ['@plate'] = foundPlate, + ['@job'] = xPlayer.job.name + }, function (rowsChanged) + if rowsChanged == 0 then + print(('esx_ambulancejob: %s has exploited the garage!'):format(xPlayer.identifier)) + cb(false) + else + cb(true, foundNum) + end + end) + end + +end) + +function getPriceFromHash(hashKey, jobGrade, type) + if type == 'helicopter' then + local vehicles = Config.AuthorizedHelicopters[jobGrade] + + for k,v in ipairs(vehicles) do + if GetHashKey(v.model) == hashKey then + return v.price + end + end + elseif type == 'car' then + local vehicles = Config.AuthorizedVehicles[jobGrade] + + for k,v in ipairs(vehicles) do + if GetHashKey(v.model) == hashKey then + return v.price + end + end + end + + return 0 +end + +RegisterServerEvent('esx_ambulancejob:removeItem') +AddEventHandler('esx_ambulancejob:removeItem', function(item) + local _source = source + local xPlayer = ESX.GetPlayerFromId(_source) + + xPlayer.removeInventoryItem(item, 1) + + if item == 'bandage' then + TriggerClientEvent('esx:showNotification', _source, _U('used_bandage')) + elseif item == 'medikit' then + TriggerClientEvent('esx:showNotification', _source, _U('used_medikit')) + end +end) + +RegisterServerEvent('esx_ambulancejob:giveItem') +AddEventHandler('esx_ambulancejob:giveItem', function(itemName) + local xPlayer = ESX.GetPlayerFromId(source) + + if xPlayer.job.name ~= 'ambulance' then + print(('esx_ambulancejob: %s attempted to spawn in an item!'):format(xPlayer.identifier)) + return + elseif (itemName ~= 'medikit' and itemName ~= 'bandage') then + print(('esx_ambulancejob: %s attempted to spawn in an item!'):format(xPlayer.identifier)) + return + end + + local xItem = xPlayer.getInventoryItem(itemName) + local count = 1 + + if xItem.limit ~= -1 then + count = xItem.limit - xItem.count + end + + if xItem.count < xItem.limit then + xPlayer.addInventoryItem(itemName, count) + else + TriggerClientEvent('esx:showNotification', source, _U('max_item')) + end +end) + +TriggerEvent('es:addGroupCommand', 'revive', 'admin', function(source, args, user) + if args[1] ~= nil then + if GetPlayerName(tonumber(args[1])) ~= nil then + print(('esx_ambulancejob: %s used admin revive'):format(GetPlayerIdentifiers(source)[1])) + TriggerClientEvent('esx_ambulancejob:revive', tonumber(args[1])) + end + else + TriggerClientEvent('esx_ambulancejob:revive', source) + end +end, function(source, args, user) + TriggerClientEvent('chat:addMessage', source, { args = { '^1SYSTEM', 'Insufficient Permissions.' } }) +end, { help = _U('revive_help'), params = {{ name = 'id' }} }) + +ESX.RegisterUsableItem('medikit', function(source) + if not playersHealing[source] then + local xPlayer = ESX.GetPlayerFromId(source) + xPlayer.removeInventoryItem('medikit', 1) + + playersHealing[source] = true + TriggerClientEvent('esx_ambulancejob:useItem', source, 'medikit') + + Citizen.Wait(10000) + playersHealing[source] = nil + end +end) + +ESX.RegisterUsableItem('bandage', function(source) + if not playersHealing[source] then + local xPlayer = ESX.GetPlayerFromId(source) + xPlayer.removeInventoryItem('bandage', 1) + + playersHealing[source] = true + TriggerClientEvent('esx_ambulancejob:useItem', source, 'bandage') + + Citizen.Wait(10000) + playersHealing[source] = nil + end +end) + +ESX.RegisterServerCallback('esx_ambulancejob:getDeathStatus', function(source, cb) + local identifier = GetPlayerIdentifiers(source)[1] + + MySQL.Async.fetchScalar('SELECT is_dead FROM users WHERE identifier = @identifier', { + ['@identifier'] = identifier + }, function(isDead) + if isDead then + print(('esx_ambulancejob: %s attempted combat logging!'):format(identifier)) + end + + cb(isDead) + end) +end) + +RegisterServerEvent('esx_ambulancejob:setDeathStatus') +AddEventHandler('esx_ambulancejob:setDeathStatus', function(isDead) + local identifier = GetPlayerIdentifiers(source)[1] + + if type(isDead) ~= 'boolean' then + print(('esx_ambulancejob: %s attempted to parse something else than a boolean to setDeathStatus!'):format(identifier)) + return + end + + MySQL.Sync.execute('UPDATE users SET is_dead = @isDead WHERE identifier = @identifier', { + ['@identifier'] = identifier, + ['@isDead'] = isDead + }) +end) diff --git a/esx_kashacter-edited-bluebens.zip b/esx_kashacter-edited-bluebens.zip new file mode 100644 index 0000000000000000000000000000000000000000..03a5e5e14e52963887af883a299bdc96b7b6e395 GIT binary patch literal 193522 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

^~!Xj-Q%-_Pd^% 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%0A3Z?s-$=wWtTL>R*a?6yGmaa9i^ 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 literal 0 HcmV?d00001 diff --git a/esx_kashacters/README.md b/esx_kashacters/README.md new file mode 100644 index 00000000..f29db6c0 --- /dev/null +++ b/esx_kashacters/README.md @@ -0,0 +1,284 @@ +# KASHacters - ESX Multi Characters + +## Installation +**_How to install instruction._ Created By XxFri3ndlyxX** +
+- First you need a serrver that has at least the basic scripts and their requirements. + + + +``` +### [ESSENTIALS] ### +start mysql-async +start essentialmode +start esplugin_mysql +start es_extended +start async +start es_ui +start es_admin2 +start esx_kashacters +start esx_identity +start skinchanger +start esx_skin +start instance +start esx_datastore +start esx_addonaccount +start esx_addoninventory +start cron +start esx_menu_default +start esx_menu_list +start esx_menu_dialog +start esx_license +start esx_billing +start esx_society +start esx_policejob +start esx_ambulancejob +start esx_vehicleshop +``` + +
+Then +
+- Download the resource +- Rename the resource to esx_kashacters +- import the sql file in your database +- Go to *essentialmode\client\main.lua* and edit/comment the code. + + +``` +--[[Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + + if NetworkIsSessionStarted() then + TriggerServerEvent('es:firstJoinProper') + TriggerEvent('es:allowedToSpawn') + return + end + end +end)]]-- +``` +## Inventory Quick Fix +- To fix the inventory not showing after death. +Quick fix you can do. +In es_extended Look for + +``` +-- Menu interactions +Citizen.CreateThread(function() + while true do + + Citizen.Wait(0) + + if IsControlJustReleased(0, Keys['F2']) and IsInputDisabled(0) and not isDead and not ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then + ESX.ShowInventory() + end + + end +end) +``` +and change it to +``` +-- Menu interactions +Citizen.CreateThread(function() + while true do + + Citizen.Wait(0) + + if IsControlJustReleased(0, Keys['F2']) and IsInputDisabled(0) and not ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then + ESX.ShowInventory() + end + + end +end) +``` +-I know this is not the best solution. But i don't have time to fix this the proper way. Use this quick fix or fix it properly on your own. I's something to do with isdead not being trigged properly. Also you can do the same to other menu that don't work by removing the and not isDead + +## Tables (Owned & Identifier) +- Now we edit the table and add all our identifier to make sure our character loads. +- *Edit the code in esx_kashacters\server\main.lua* + + +``` +local IdentifierTables = { + {table = "addon_account_data", column = "owner"}, + {table = "addon_inventory_items", column = "owner"}, + {table = "billing", column = "identifier"}, + {table = "characters", column = "identifier"}, + {table = "datastore_data", column = "owner"}, + {table = "owned_vehicles", column = "owner"}, + {table = "rented_vehicles", column = "owner"}, + {table = "society_moneywash", column = "identifier"}, + {table = "users", column = "identifier"}, + {table = "user_accounts", column = "identifier"}, + {table = "user_inventory", column = "identifier"}, + {table = "user_licenses", column = "owner"}, +} +``` + +To get your identifier. +Do this query in your database + +`SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner'` + +and + +`SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'indentifier'` + + +Credit @Xnubil for this query line + + +The table list provided is just an example. Yours may differ depending on what you install on your server. + +Once You've done all that. add start esx_kashacters to your server.cfg + + +## Ambulance Fix +The Fix for the ambulance on the kashacter script is already implemented. + +Now all you have to do is go to your ambulance script that is up to date and +comment or delete + + + +``` +--[[ +AddEventHandler('playerSpawned', function() + IsDead = false + + if FirstSpawn then + exports.spawnmanager:setAutoSpawn(false) -- disable respawn + FirstSpawn = false + + ESX.TriggerServerCallback('esx_ambulancejob:getDeathStatus', function(isDead) + if isDead and Config.AntiCombatLog then + while not PlayerLoaded do + Citizen.Wait(1000) + end + + ESX.ShowNotification(_U('combatlog_message')) + RemoveItemsAfterRPDeath() + end + end) + end +end) +]]-- +``` +
+Then add this +
+ +``` +RegisterNetEvent('esx_ambulancejob:multicharacter') +AddEventHandler('esx_ambulancejob:multicharacter', function() + IsDead = false + + ESX.TriggerServerCallback('esx_ambulancejob:getDeathStatus', function(isDead) + if isDead and Config.AntiCombatLog then + ESX.ShowNotification(_U('combatlog_message')) + RemoveItemsAfterRPDeath() + end + end) +end) +``` +Then change this +``` +function RespawnPed(ped, coords, heading) + SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false, false, true) + NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, heading, true, false) + SetPlayerInvincible(ped, false) + TriggerEvent('playerspawned', coords.x, coords.y, coords.z) + ClearPedBloodDamage(ped) + + ESX.UI.Menu.CloseAll() +end +``` +to +``` +function RespawnPed(ped, coords, heading) + SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false, false, true) + NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, heading, true, false) + SetPlayerInvincible(ped, false) + TriggerEvent('esx_ambulancejob:multicharacter', coords.x, coords.y, coords.z) + ClearPedBloodDamage(ped) + + ESX.UI.Menu.CloseAll() +end +``` +If you do not do this last part once you repawn after death you will be frozen into place. + +## Duplication Entry (Datastore) +To fix The datastore duplicated entry download this https://github.com/XxFri3ndlyxX/esx_datastore + +Or + +Add this code to your server/main.lua +```-- Fix for kashacters duplication entry -- +-- Fix was taken from this link -- +-- https://forum.fivem.net/t/release-esx-kashacters-multi-character/251613/448?u=xxfri3ndlyxx -- +AddEventHandler('esx:playerLoaded', function(source) + + local result = MySQL.Sync.fetchAll('SELECT * FROM datastore') + + for i=1, #result, 1 do + local name = result[i].name + local label = result[i].label + local shared = result[i].shared + + local result2 = MySQL.Sync.fetchAll('SELECT * FROM datastore_data WHERE name = @name', { + ['@name'] = name + }) + + if shared == 0 then + + table.insert(DataStoresIndex, name) + DataStores[name] = {} + + for j=1, #result2, 1 do + local storeName = result2[j].name + local storeOwner = result2[j].owner + local storeData = (result2[j].data == nil and {} or json.decode(result2[j].data)) + local dataStore = CreateDataStore(storeName, storeOwner, storeData) + + table.insert(DataStores[name], dataStore) + end + end + end + + local _source = source + local xPlayer = ESX.GetPlayerFromId(_source) + local dataStores = {} + + for i=1, #DataStoresIndex, 1 do + local name = DataStoresIndex[i] + local dataStore = GetDataStore(name, xPlayer.identifier) + + if dataStore == nil then + MySQL.Async.execute('INSERT INTO datastore_data (name, owner, data) VALUES (@name, @owner, @data)', + { + ['@name'] = name, + ['@owner'] = xPlayer.identifier, + ['@data'] = '{}' + }) + + dataStore = CreateDataStore(name, xPlayer.identifier, {}) + table.insert(DataStores[name], dataStore) + end + + table.insert(dataStores, dataStore) + end + + xPlayer.set('dataStores', dataStores) +end) +``` + +> *Pay ATTENTION: You have to call the resource 'esx_kashacters' in order for the javascript to work!!!** + +## How it works +> What this script does it manipulates ESX for loading characters +So when you are choosing your character it changes your steam id which is normally steam: to Char: this prevents ESX from loading another character because it is looking for you exact steamid. So when you choose your character it will change it from Char: to your normal steam id (steam:). When creating a new character it will spawn you without an exact steamid which creates a new database entry for your steamid + +## Credits + +> ESX Framework and **KASH** AND **Onno204** for creating the resource. You can do whatever the f with it what you want but it is nice to give the main man credits ;) diff --git a/esx_kashacters/__resource.lua b/esx_kashacters/__resource.lua new file mode 100644 index 00000000..f54f029c --- /dev/null +++ b/esx_kashacters/__resource.lua @@ -0,0 +1,19 @@ +resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' + +server_scripts { + "@mysql-async/lib/MySQL.lua", + "server/main.lua", +} + +client_scripts { + "client/main.lua", +} + +ui_page { + 'html/ui.html', +} +files { + 'html/ui.html', + 'html/css/main.css', + 'html/js/app.js', +} diff --git a/esx_kashacters/client/main.lua b/esx_kashacters/client/main.lua new file mode 100644 index 00000000..ae01ea31 --- /dev/null +++ b/esx_kashacters/client/main.lua @@ -0,0 +1,120 @@ +ESX = nil +Citizen.CreateThread(function() + while ESX == nil do + Citizen.Wait(200) + TriggerEvent('esx:getSharedObject', function (obj) ESX = obj end) + end +end) + +-- This Code Was changed to fix error With player spawner as default -- +-- Link to the post with the error fix -- +-- https://forum.fivem.net/t/release-esx-kashacters-multi-character/251613/316?u=xxfri3ndlyxx -- +Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + if NetworkIsSessionStarted() then + Citizen.Wait(100) + TriggerServerEvent("kashactersS:SetupCharacters") + TriggerEvent("kashactersC:SetupCharacters") + return -- break the loop + end + end +end) + +local IsChoosing = true +Citizen.CreateThread(function () + while true do + Citizen.Wait(0) + if IsChoosing then + DisplayHud(false) + DisplayRadar(false) + end + end +end) +local cam = nil +local cam2 = nil +RegisterNetEvent('kashactersC:SetupCharacters') +AddEventHandler('kashactersC:SetupCharacters', function() + DoScreenFadeOut(10) + while not IsScreenFadedOut() do + Citizen.Wait(10) + end + SetTimecycleModifier('hud_def_blur') + FreezeEntityPosition(GetPlayerPed(-1), true) + cam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", -1355.93,-1487.78,520.75, 300.00,0.00,0.00, 100.00, false, 0) + SetCamActive(cam, true) + RenderScriptCams(true, false, 1, true, true) +end) + +RegisterNetEvent('kashactersC:SetupUI') +AddEventHandler('kashactersC:SetupUI', function(Characters) + DoScreenFadeIn(500) + Citizen.Wait(500) + SetNuiFocus(true, true) + SendNUIMessage({ + action = "openui", + characters = Characters, + }) +end) + +RegisterNetEvent('kashactersC:SpawnCharacter') +AddEventHandler('kashactersC:SpawnCharacter', function(spawn, isnew) + TriggerServerEvent('es:firstJoinProper') + TriggerEvent('es:allowedToSpawn') + + SetTimecycleModifier('default') + local pos = spawn + SetEntityCoords(GetPlayerPed(-1), pos.x, pos.y, pos.z) + DoScreenFadeIn(500) + Citizen.Wait(500) + cam2 = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", -1355.93,-1487.78,520.75, 300.00,0.00,0.00, 100.00, false, 0) + PointCamAtCoord(cam2, pos.x,pos.y,pos.z+200) + SetCamActiveWithInterp(cam2, cam, 900, true, true) + Citizen.Wait(900) + exports.spawnmanager:setAutoSpawn(false) + TriggerEvent('esx_ambulancejob:multicharacter', source) + + if isnew then + TriggerEvent('esx_identity:showRegisterIdentity') + end + + cam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", pos.x,pos.y,pos.z+200, 300.00,0.00,0.00, 100.00, false, 0) + PointCamAtCoord(cam, pos.x,pos.y,pos.z+2) + SetCamActiveWithInterp(cam, cam2, 3700, true, true) + Citizen.Wait(3700) + PlaySoundFrontend(-1, "Zoom_Out", "DLC_HEIST_PLANNING_BOARD_SOUNDS", 1) + RenderScriptCams(false, true, 500, true, true) + PlaySoundFrontend(-1, "CAR_BIKE_WHOOSH", "MP_LOBBY_SOUNDS", 1) + FreezeEntityPosition(GetPlayerPed(-1), false) + Citizen.Wait(500) + SetCamActive(cam, false) + DestroyCam(cam, true) + IsChoosing = false + DisplayHud(true) + DisplayRadar(true) +end) + +RegisterNetEvent('kashactersC:ReloadCharacters') +AddEventHandler('kashactersC:ReloadCharacters', function() + TriggerServerEvent("kashactersS:SetupCharacters") + TriggerEvent("kashactersC:SetupCharacters") +end) + +RegisterNUICallback("CharacterChosen", function(data, cb) + SetNuiFocus(false,false) + DoScreenFadeOut(500) + TriggerServerEvent('kashactersS:CharacterChosen', data.charid, data.ischar) + while not IsScreenFadedOut() do + Citizen.Wait(10) + end + cb("ok") +end) +RegisterNUICallback("DeleteCharacter", function(data, cb) + SetNuiFocus(false,false) + DoScreenFadeOut(500) + TriggerServerEvent('kashactersS:DeleteCharacter', data.charid) + while not IsScreenFadedOut() do + Citizen.Wait(10) + end + cb("ok") +end) diff --git a/esx_kashacters/esx_kashacters.sql b/esx_kashacters/esx_kashacters.sql new file mode 100644 index 00000000..f8624fbf --- /dev/null +++ b/esx_kashacters/esx_kashacters.sql @@ -0,0 +1,39 @@ +-- phpMyAdmin SQL Dump +-- version 4.8.0.1 +-- https://www.phpmyadmin.net/ +-- +-- Host: 127.0.0.1 +-- Gegenereerd op: 02 feb 2019 om 20:58 +-- Serverversie: 10.1.32-MariaDB +-- PHP-versie: 7.2.5 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Database: `esx_standalone` +-- + +-- -------------------------------------------------------- + +-- +-- Tabelstructuur voor tabel `user_lastcharacter` +-- + +CREATE TABLE `user_lastcharacter` ( + `steamid` varchar(255) NOT NULL, + `charid` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/esx_kashacters/html/css/main.css b/esx_kashacters/html/css/main.css new file mode 100644 index 00000000..caf796c7 --- /dev/null +++ b/esx_kashacters/html/css/main.css @@ -0,0 +1,72 @@ +html { + overflow: hidden; +} + +p { + margin: 0 !important; +} + +.main-container { + display:none; + width: 70vw; + margin: auto; + position: relative; + top: 35vh; +} + +.character-container { + width: 100%; + margin: auto; + display: flex; + justify-content: space-between; +} + +.character-box { + color: #FFFFFF; + background: rgba(0,0,0,0.6); + padding: 20px; + text-align: center; + border: 2px solid transparent; +} + +.character-box:hover { + background: rgba(42, 125, 193,1.0); + border-radius: 5px; + transition: 200ms; +} + +.character-info { + text-align: left!important; +} + +.character-buttons { + display: none; + width: 70vw; + margin:15px auto; +} + +.btn-play { + background: #43A047; + color: #FFFFFF; + float:left; + margin-right: 10px; +} + +.btn-play:hover { + background: #2eb72c; +} + +.btn-delete { + background: #930b0b; + color: #FFFFFF; + float:left; +} + +.btn-delete:hover { + background: #b50c0c; +} + +.active-char { + border: 2px solid rgba(0,0,0,0.4); +} + diff --git a/esx_kashacters/html/js/app.js b/esx_kashacters/html/js/app.js new file mode 100644 index 00000000..db2fa3f3 --- /dev/null +++ b/esx_kashacters/html/js/app.js @@ -0,0 +1,72 @@ +$(".character-box").hover( + function() { + $(this).css({ + "background": "rgba(42, 125, 193, 1.0)", + "transition": "200ms", + }); + }, function() { + $(this).css({ + "background": "rgba(0,0,0,0.6)", + "transition": "200ms", + }); + } +); + +$(".character-box").click(function () { + $(".character-box").removeClass('active-char'); + $(this).addClass('active-char'); + $(".character-buttons").css({"display":"block"}); + if ($(this).attr("data-ischar") === "true") { + $("#delete").css({"display":"block"}); + } else { + $("#delete").css({"display":"none"}); + } +}); + +$("#play-char").click(function () { + $.post("http://esx_kashacters/CharacterChosen", JSON.stringify({ + charid: $('.active-char').attr("data-charid"), + ischar: $('.active-char').attr("data-ischar"), + })); + Kashacter.CloseUI(); +}); + +$("#deletechar").click(function () { + $.post("http://esx_kashacters/DeleteCharacter", JSON.stringify({ + charid: $('.active-char').attr("data-charid"), + })); + Kashacter.CloseUI(); +}); + +(() => { + Kashacter = {}; + + Kashacter.ShowUI = function(data) { + $('.main-container').css({"display":"block"}); + if(data.characters !== null) { + $.each(data.characters, function (index, char) { + if (char.charid !== 0) { + var charid = char.identifier.charAt(4); + $('[data-charid=' + charid + ']').html('

'+ char.firstname +' '+ char.lastname +'

').attr("data-ischar", "true"); + } + }); + } + }; + + Kashacter.CloseUI = function() { + $('.main-container').css({"display":"none"}); + $(".character-box").removeClass('active-char'); + $("#delete").css({"display":"none"}); + $(".character-box").html('

Create new character

').attr("data-ischar", "false"); + }; + window.onload = function(e) { + window.addEventListener('message', function(event) { + switch(event.data.action) { + case 'openui': + Kashacter.ShowUI(event.data); + break; + } + }) + } + +})(); \ No newline at end of file diff --git a/esx_kashacters/html/ui.html b/esx_kashacters/html/ui.html new file mode 100644 index 00000000..3e5df858 --- /dev/null +++ b/esx_kashacters/html/ui.html @@ -0,0 +1,70 @@ + + + + + + + + + + + + + +
+
+
+

+
+

Create new character

+
+
+
+

+
+

Create new character

+
+
+
+

+
+

Create new character

+
+
+
+

+
+

Create new character

+
+
+
+
+ + +
+
+ + + + + + + + \ No newline at end of file diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua new file mode 100644 index 00000000..388a363a --- /dev/null +++ b/esx_kashacters/server/main.lua @@ -0,0 +1,122 @@ +--------------------------------------------------------------------------------------- +-- Edit this table to all the database tables and columns +-- where identifiers are used (such as users, owned_vehicles, owned_properties etc.) +--------------------------------------------------------------------------------------- +local IdentifierTables = { + {table = "users", column = "identifier"}, + {table = "user_accounts", column = "identifier"}, + -- {table = "user_contacts", column = "identifier"}, + {table = "user_inventory", column = "identifier"}, + -- {table = "user_parkings", column = "identifier"}, + {table = "society_moneywash", column = "identifier"}, + {table = "phone_users_contacts", column = "identifier"}, + --{table = "jail", column = "identifier"}, + {table = "characters", column = "identifier"}, + {table = "billing", column = "identifier"}, + {table = "rented_vehicles", column = "owner"}, + {table = "addon_account_data", column = "owner"}, + {table = "addon_inventory_items", column = "owner"}, + {table = "datastore_data", column = "owner"}, + {table = "owned_vehicles", column = "owner"}, + {table = "phone_calls", column = "owner"}, + {table = "phone_messages", column = "owner"}, + {table = "rented_vehicles", column = "owner"}, + {table = "user_licenses", column = "owner"}, +} + +RegisterServerEvent("kashactersS:SetupCharacters") +AddEventHandler('kashactersS:SetupCharacters', function() + local src = source + local LastCharId = GetLastCharacter(src) + SetIdentifierToChar(GetPlayerIdentifiers(src)[1], LastCharId) + local Characters = GetPlayerCharacters(src) + TriggerClientEvent('kashactersC:SetupUI', src, Characters) +end) + +RegisterServerEvent("kashactersS:CharacterChosen") +AddEventHandler('kashactersS:CharacterChosen', function(charid, ischar) + local src = source + local spawn = {} + SetLastCharacter(src, tonumber(charid)) + SetCharToIdentifier(GetPlayerIdentifiers(src)[1], tonumber(charid)) + if ischar == "true" then + spawn = GetSpawnPos(src) + else + TriggerClientEvent('skinchanger:loadDefaultModel', src, true, cb) + spawn = { x = 195.55, y = -933.36, z = 29.90 } -- DEFAULT SPAWN POSITION + end + TriggerClientEvent("kashactersC:SpawnCharacter", src, spawn) +end) + +RegisterServerEvent("kashactersS:DeleteCharacter") +AddEventHandler('kashactersS:DeleteCharacter', function(charid) + local src = source + DeleteCharacter(GetPlayerIdentifiers(src)[1], charid) + TriggerClientEvent("kashactersC:ReloadCharacters", src) +end) + +function GetPlayerCharacters(source) + local identifier = GetIdentifierWithoutSteam(GetPlayerIdentifiers(source)[1]) + local Chars = MySQLAsyncExecute("SELECT * FROM `users` WHERE identifier LIKE '%"..identifier.."%'") + for i = 1, #Chars, 1 do + charJob = MySQLAsyncExecute("SELECT * FROM `jobs` WHERE `name` = '"..Chars[i].job.."'") + charJobgrade = MySQLAsyncExecute("SELECT * FROM `job_grades` WHERE `grade` = '"..Chars[i].job_grade.."'") + Chars[i].job = charJob[1].label + Chars[i].job_grade = charJobgrade[1].label + end + return Chars +end + +function GetLastCharacter(source) + local LastChar = MySQLAsyncExecute("SELECT `charid` FROM `user_lastcharacter` WHERE `steamid` = '"..GetPlayerIdentifiers(source)[1].."'") + if LastChar[1] ~= nil and LastChar[1].charid ~= nil then + return tonumber(LastChar[1].charid) + else + MySQLAsyncExecute("INSERT INTO `user_lastcharacter` (`steamid`, `charid`) VALUES('"..GetPlayerIdentifiers(source)[1].."', 1)") + return 1 + end +end + +function SetLastCharacter(source, charid) + MySQLAsyncExecute("UPDATE `user_lastcharacter` SET `charid` = '"..charid.."' WHERE `steamid` = '"..GetPlayerIdentifiers(source)[1].."'") +end + +function SetIdentifierToChar(identifier, charid) + for _, itable in pairs(IdentifierTables) do + MySQLAsyncExecute("UPDATE `"..itable.table.."` SET `"..itable.column.."` = 'Char"..charid..GetIdentifierWithoutSteam(identifier).."' WHERE `"..itable.column.."` = '"..identifier.."'") + end +end + +function SetCharToIdentifier(identifier, charid) + for _, itable in pairs(IdentifierTables) do + MySQLAsyncExecute("UPDATE `"..itable.table.."` SET `"..itable.column.."` = '"..identifier.."' WHERE `"..itable.column.."` = 'Char"..charid..GetIdentifierWithoutSteam(identifier).."'") + end +end + +function DeleteCharacter(identifier, charid) + for _, itable in pairs(IdentifierTables) do + MySQLAsyncExecute("DELETE FROM `"..itable.table.."` WHERE `"..itable.column.."` = 'Char"..charid..GetIdentifierWithoutSteam(identifier).."'") + end +end + +function GetSpawnPos(source) + local SpawnPos = MySQLAsyncExecute("SELECT `position` FROM `users` WHERE `identifier` = '"..GetPlayerIdentifiers(source)[1].."'") + return json.decode(SpawnPos[1].position) +end + +function GetIdentifierWithoutSteam(Identifier) + return string.gsub(Identifier, "steam", "") +end + +function MySQLAsyncExecute(query) + local IsBusy = true + local result = nil + MySQL.Async.fetchAll(query, {}, function(data) + result = data + IsBusy = false + end) + while IsBusy do + Citizen.Wait(0) + end + return result +end diff --git a/mysql-async/LICENSE b/mysql-async/LICENSE new file mode 100644 index 00000000..64b7d3ac --- /dev/null +++ b/mysql-async/LICENSE @@ -0,0 +1,14 @@ +Copyright © 2017, Joel Wurtz; © 2018 Matthias Mandelartz + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the “Software”), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the +warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or +copyright holders X be liable for any claim, damages or other liability, whether in an action of contract, tort or +otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software. diff --git a/mysql-async/README.md b/mysql-async/README.md new file mode 100644 index 00000000..cc2d6ae7 --- /dev/null +++ b/mysql-async/README.md @@ -0,0 +1,126 @@ +# MySQL Async Library for FiveM + +This library intends to provide function to connect to a MySQL library in a Sync and Async Way. + +## Disclaimer + +This mod does not replace EssentialMode, it offers instead a way of connecting to MySQL from lua-scripts, but +it will never contain any gameplay logic. It will remain a simple wrapper around MySQL functions. + +All feedback is appreciated in order to deliver a stable release. + +## Installation + +Install the content of this repository in the `resources/mysql-async` folder. **Name of the folder** matters, +do not use a different name (otherwise you must have knowledge on how this works and make the appropriate changes) + +Once installed, you will need to add this line of code in the resource file of each mod needing a MySQL client: + +``` +server_script '@mysql-async/lib/MySQL.lua' +``` + +### Warning + +On Linux servers, users need to stick with the old mysql-async 2.x at least for the moment, due to some issues the linux server has with v8/javascript. + +It can be downloaded from https://github.com/brouznouf/fivem-mysql-async/tree/2.0 or the release section. Note that the connection_string is different for 3.0.0 and 2.x. + +## Configuration + +Add this convar to your server configuration and change the values according to your MySQL installation: + +`set mysql_connection_string "mysql://username:password@host/database?dateStrings=true"` + +Further options can be found under https://github.com/mysqljs/mysql#connection-options + +## Usage + +### Waiting for MySQL to be ready + +You need to encapsulate your code into `MySQL.ready` to be sure that the mod will be available and initialized +before your first request. + +```lua +MySQL.ready(function () + print(MySQL.Sync.fetchScalar('SELECT @parameters', { + ['@parameters'] = 'string' + })) +end) +``` + +### Async + +#### MySQL.Async.execute(string query, array params, function callback) + +Works like `MySQL.Sync.execute` but will return immediatly instead of waiting for the execution of the query. +To exploit the result of an async method you must use a callback function: + +```lua +MySQL.Async.execute('SELECT SLEEP(10)', {}, function(rowsChanged) + print(rowsChanged) +end) +``` + +#### MySQL.Async.fetchAll(string query, array params, function callback) + +Works like `MySQL.Sync.fetchAll` and provide callback like the `MySQL.Async.execute` method: + +```lua +MySQL.Async.fetchAll('SELECT * FROM player', {}, function(players) + print(players[1].name) +end) +``` + +#### MySQL.Async.fetchScalar(string query, array params, function callback) + +Same as before for the fetchScalar method. + +```lua +MySQL.Async.fetchScalar("SELECT COUNT(1) FROM players", function(countPlayer) + print(countPlayer) +end +``` + +### Sync + +> Sync functions can block the main thread, always prefer the Async version if possible, there is very rare +> use case for you to use this. + +#### MySQL.Sync.execute(string query, array params) : int + +Execute a mysql query which should not send any result (like a Insert / Delete / Update), and will return the +number of affected rows. + +```lua +MySQL.Sync.execute("UPDATE player SET name=@name WHERE id=@id", {['@id'] = 10, ['@name'] = 'foo'}) +``` + +#### MySQL.Sync.fetchAll(string query, array params) : object[] + +Fetch results from MySQL and returns them in the form of an Array of Objects: + +```lua +local players = MySQL.Sync.fetchAll('SELECT id, name FROM player') +print(players[1].id) +``` + +#### MySQL.Sync.fetchScalar(string query, array params) : mixed + +Fetch the first field of the first row in a query: + +```lua +local countPlayer = MySQL.Sync.fetchScalar("SELECT COUNT(1) FROM players") +``` + +## Features + + * Async / Sync + * It uses the https://github.com/mysqljs/mysql library to provide a connection to your mysql server. + * Create and close a connection for each query, the underlying library use a connection pool so only the +mysql auth is done each time, old tcp connections are keeped in memory for performance reasons + +## Credits + +Some parts of this library, and also my understanding were directly inspired by "Essential Mode", thanks to +them to have begin to work on this, which allows guy like me to not start from scratch every time... diff --git a/mysql-async/UPGRADING.md b/mysql-async/UPGRADING.md new file mode 100644 index 00000000..9d5327a7 --- /dev/null +++ b/mysql-async/UPGRADING.md @@ -0,0 +1,55 @@ +# Upgrading from Legacy Server + +## A note about EssentialMode + +This library does not provide api compatibility with EssentialMode. The reason is that old API was not logic due to the + way on how mysql work which was inducing bad behavior, like executing multiple queries instead of one, or using only one + connection for all players (which was the main source of bug, having sync is not a problem as long as you know what you + are doing). + +Then if you come from legacy server and still using essential mod API, you should update by using this path: + + * Use the 1.0 of this library and read the UPGRADING.md file of it to use the new API + * Then you can Update to fxserver and use the 2.X version of this lib + * Then read the following advices on how to update your existing codebase for the 2.0 version + +## Require + +The `require` keyword does not exist anymore and will throw an error on fxserver. You should remove all references to +require, there is no replacement as this is no longer useful. + +However you will have to add this line to your resource file `__resource.lua` in order to have access to the mysql async: + +```lua +server_script '@mysql-async/lib/MySQL.lua' +``` + +## Configuration + +There is no more configuration file in this lib, instead it use directly a `conv_var` which is basically a variable set +in the configuration file of your fxserver `server.cfg` + +So you can remove the config file that you were having and add this line into your `server.cfg` file : + +``` +set mysql_connection_string "server=mariadb;database=fivem;userid=root;password=fivem" +``` + +It is highly recommended to set those variable **before** starting modules so they will be available directly on startup +(even if we provide some safety check for someone defining this var after...) + +## Startup code with queries + +You may have some sql queries at the start of your module, however due to the new way of loading modules in fxserver +(which is somehow async): Your library can be loaded before mysql-async even if you start it after. + +To handle this use case, this library provide a special event `onMySQLReady` that is emitted once it's loaded, so you can do: + +```lua +AddEventHandler('onMySQLReady', function () + -- Startup code using mysql +end) +``` + + + diff --git a/mysql-async/__resource.lua b/mysql-async/__resource.lua new file mode 100644 index 00000000..df3f8118 --- /dev/null +++ b/mysql-async/__resource.lua @@ -0,0 +1,3 @@ +resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' + +server_script 'mysql-async.js' diff --git a/mysql-async/example.lua b/mysql-async/example.lua new file mode 100644 index 00000000..13ef9f5f --- /dev/null +++ b/mysql-async/example.lua @@ -0,0 +1,84 @@ +--executed = 0 +--received = 0 +-- +--local function Loop() +-- SetTimeout(2, function () +---- MySQL.Sync.fetchAll('WRONG SQL QUERY', {}) +-- +-- MySQL.Sync.fetchScalar('SELECT @parameters', { +-- ['@parameters'] = 'string' +-- }) +-- +-- executed = executed + 1 +-- +-- MySQL.Async.fetchAll('SELECT "hello2" as world', {}, function(result) +-- received = received + 1 +-- end) +-- +-- if executed % 100 == 0 then +-- print(received .. "/" .. executed) +-- end +-- +-- Loop() +-- end) +--end +-- +--AddEventHandler('onMySQLReady', function () +-- Loop() +--end) + +MySQL.ready(function () + print(MySQL.Sync.fetchScalar('SELECT @parameters', { + ['@parameters'] = 1 + })) + + print(MySQL.Sync.fetchScalar('SELECT @parameters', { + ['@parameters'] = 'string' + })) + + MySQL.Async.fetchScalar('SELECT NOW() as world', {}, function(result) + print(result) + end) + + MySQL.Async.execute('SELECT SLEEP(5)', nil, function() + print("1") + end) + MySQL.Async.execute('SELECT SLEEP(4)', nil, function() + print("2") + end) + MySQL.Async.execute('SELECT SLEEP(3)', {}, function() + print("3") + end) + MySQL.Async.execute('SELECT SLEEP(2)', nil, function() + print("4") + end) + MySQL.Async.execute('SELECT SLEEP(1)', nil, function() + print("5") + end) + + print(MySQL.Sync.fetchScalar("SELECT money FROM users WHERE id = 'yolo' ")) + + MySQL.Async.fetchAll("SELECT money FROM users WHERE id = 'yolo' ", {}, function (result) + print(#result) + end) + + print(MySQL.Sync.fetchAll('SELECT "hello1" as world', {})[1].world) + + MySQL.Async.fetchAll('SELECT "hello2" as world', {}, function(result) + print(result[1].world) + end) + + print(MySQL.Sync.fetchScalar('SELECT "hello3" as world', {})) + + MySQL.Async.fetchScalar('SELECT "hello4" as world', {}, function(result) + print(result) + end) + + print(json.encode(MySQL.Sync.fetchScalar('SELECT null', {}))) + + MySQL.Async.fetchScalar('SELECT null', {}, function(result) + print(result) + end) + + MySQL.Sync.fetchAll('WRONG SQL QUERY', {}) +end) diff --git a/mysql-async/lib/MySQL.lua b/mysql-async/lib/MySQL.lua new file mode 100644 index 00000000..f8ae6cf9 --- /dev/null +++ b/mysql-async/lib/MySQL.lua @@ -0,0 +1,212 @@ +MySQL = { + Async = {}, + Sync = {}, + Threaded = {} -- remove in the next big version +} + +local function safeParameters(params) + if nil == params then + return {[''] = ''} + end + + assert(type(params) == "table", "A table is expected") + assert(params[1] == nil, "Parameters should not be an array, but a map (key / value pair) instead") + + if next(params) == nil then + return {[''] = ''} + end + + return params +end + +--- +-- Execute a query with no result required, sync version +-- +-- @param query +-- @param params +-- +-- @return int Number of rows updated +-- +function MySQL.Sync.execute(query, params) + assert(type(query) == "string", "The SQL Query must be a string") + + local res = 0 + local finishedQuery = false + exports['mysql-async']:mysql_execute(query, safeParameters(params), function (result) + res = result + finishedQuery = true + end) + repeat Citizen.Wait(0) until finishedQuery == true + return res +end +--- +-- Execute a query and fetch all results in an sync way +-- +-- @param query +-- @param params +-- +-- @return table Query results +-- +function MySQL.Sync.fetchAll(query, params) + assert(type(query) == "string", "The SQL Query must be a string") + + local res = {} + local finishedQuery = false + exports['mysql-async']:mysql_fetch_all(query, safeParameters(params), function (result) + res = result + finishedQuery = true + end) + repeat Citizen.Wait(0) until finishedQuery == true + return res +end + +--- +-- Execute a query and fetch the first column of the first row, sync version +-- Useful for count function by example +-- +-- @param query +-- @param params +-- +-- @return mixed Value of the first column in the first row +-- +function MySQL.Sync.fetchScalar(query, params) + assert(type(query) == "string", "The SQL Query must be a string") + + local res = '' + local finishedQuery = false + exports['mysql-async']:mysql_fetch_scalar(query, safeParameters(params), function (result) + res = result + finishedQuery = true + end) + repeat Citizen.Wait(0) until finishedQuery == true + return res +end + +--- +-- Execute a query and retrieve the last id insert, sync version +-- +-- @param query +-- @param params +-- +-- @return mixed Value of the last insert id +-- +function MySQL.Sync.insert(query, params) + assert(type(query) == "string", "The SQL Query must be a string") + + local res = 0 + local finishedQuery = false + exports['mysql-async']:mysql_insert(query, safeParameters(params), function (result) + res = result + finishedQuery = true + end) + repeat Citizen.Wait(0) until finishedQuery == true + return res +end + +--- +-- Execute a List of querys and returns bool true when all are executed successfully +-- +-- @param querys +-- @param params +-- +-- @return bool if the transaction was successful +-- +--function MySQL.Sync.transaction(querys, params) +-- assert(type(querys) == "table", "The SQL Query must be a table of strings") +-- +-- return exports['mysql-async']:mysql_sync_transaction(querys, safeParameters(params)) +--end + +--- +-- Execute a query with no result required, async version +-- +-- @param query +-- @param params +-- @param func(int) +-- +function MySQL.Async.execute(query, params, func) + assert(type(query) == "string", "The SQL Query must be a string") + + exports['mysql-async']:mysql_execute(query, safeParameters(params), func) +end + +--- +-- Execute a query and fetch all results in an async way +-- +-- @param query +-- @param params +-- @param func(table) +-- +function MySQL.Async.fetchAll(query, params, func) + assert(type(query) == "string", "The SQL Query must be a string") + + exports['mysql-async']:mysql_fetch_all(query, safeParameters(params), func) +end + +--- +-- Execute a query and fetch the first column of the first row, async version +-- Useful for count function by example +-- +-- @param query +-- @param params +-- @param func(mixed) +-- +function MySQL.Async.fetchScalar(query, params, func) + assert(type(query) == "string", "The SQL Query must be a string") + + exports['mysql-async']:mysql_fetch_scalar(query, safeParameters(params), func) +end + +--- +-- Execute a query and retrieve the last id insert, async version +-- +-- @param query +-- @param params +-- @param func(string) +-- +function MySQL.Async.insert(query, params, func) + assert(type(query) == "string", "The SQL Query must be a string") + + exports['mysql-async']:mysql_insert(query, safeParameters(params), func) +end + +--- +-- Execute a List of querys and returns bool true when all are executed successfully +-- +-- @param querys +-- @param params +-- @param func(bool) +-- +--function MySQL.Async.transaction(querys, params, func) +-- assert(type(querys) == "table", "The SQL Query must be a table of strings") +-- +-- return exports['mysql-async']:mysql_transaction(querys, safeParameters(params), func) +--end + +-- +-- Remove in the next big update +-- +MySQL.Threaded.execute = MySQL.Sync.execute +MySQL.Threaded.fetchAll = MySQL.Sync.fetchAll +MySQL.Threaded.fetchScalar = MySQL.Sync.fetchScalar +MySQL.Threaded.insert = MySQL.Sync.insert + + +local isReady = false +local callbackDictionary = {} + +AddEventHandler('MySQLReady', function () + isReady = true + for i, cb in ipairs(callbackDictionary) do + callbackDictionary[i] = nil + cb() + end +end) + +function MySQL.ready (callback) + if isReady then + callback() + else + table.insert(callbackDictionary, callback) + end +end diff --git a/mysql-async/mysql-async.js b/mysql-async/mysql-async.js new file mode 100644 index 00000000..c55ebec6 --- /dev/null +++ b/mysql-async/mysql-async.js @@ -0,0 +1,14510 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 30); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports) { + +module.exports = require("util"); + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +/* eslint-disable node/no-deprecated-api */ +var buffer = __webpack_require__(39) +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +exports.AuthSwitchRequestPacket = __webpack_require__(43); +exports.AuthSwitchResponsePacket = __webpack_require__(44); +exports.ClientAuthenticationPacket = __webpack_require__(45); +exports.ComChangeUserPacket = __webpack_require__(46); +exports.ComPingPacket = __webpack_require__(47); +exports.ComQueryPacket = __webpack_require__(48); +exports.ComQuitPacket = __webpack_require__(49); +exports.ComStatisticsPacket = __webpack_require__(50); +exports.EmptyPacket = __webpack_require__(51); +exports.EofPacket = __webpack_require__(52); +exports.ErrorPacket = __webpack_require__(53); +exports.Field = __webpack_require__(17); +exports.FieldPacket = __webpack_require__(54); +exports.HandshakeInitializationPacket = __webpack_require__(55); +exports.LocalDataFilePacket = __webpack_require__(56); +exports.OkPacket = __webpack_require__(57); +exports.OldPasswordPacket = __webpack_require__(58); +exports.ResultSetHeaderPacket = __webpack_require__(59); +exports.RowDataPacket = __webpack_require__(60); +exports.SSLRequestPacket = __webpack_require__(61); +exports.StatisticsPacket = __webpack_require__(62); +exports.UseOldPasswordPacket = __webpack_require__(63); + + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +var Util = __webpack_require__(0); +var EventEmitter = __webpack_require__(4).EventEmitter; +var Packets = __webpack_require__(2); +var ErrorConstants = __webpack_require__(64); +var Timer = __webpack_require__(65); + +// istanbul ignore next: Node.js < 0.10 not covered +var listenerCount = EventEmitter.listenerCount + || function(emitter, type){ return emitter.listeners(type).length; }; + +var LONG_STACK_DELIMITER = '\n --------------------\n'; + +module.exports = Sequence; +Util.inherits(Sequence, EventEmitter); +function Sequence(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + EventEmitter.call(this); + + options = options || {}; + + this._callback = callback; + this._callSite = null; + this._ended = false; + this._timeout = options.timeout; + this._timer = new Timer(this); +} + +Sequence.determinePacket = function(byte) { + switch (byte) { + case 0x00: return Packets.OkPacket; + case 0xfe: return Packets.EofPacket; + case 0xff: return Packets.ErrorPacket; + default: return undefined; + } +}; + +Sequence.prototype.hasErrorHandler = function() { + return Boolean(this._callback) || listenerCount(this, 'error') > 1; +}; + +Sequence.prototype._packetToError = function(packet) { + var code = ErrorConstants[packet.errno] || 'UNKNOWN_CODE_PLEASE_REPORT'; + var err = new Error(code + ': ' + packet.message); + err.code = code; + err.errno = packet.errno; + + err.sqlMessage = packet.message; + err.sqlState = packet.sqlState; + + return err; +}; + +Sequence.prototype.end = function(err) { + if (this._ended) { + return; + } + + this._ended = true; + + if (err) { + this._addLongStackTrace(err); + } + + // Without this we are leaking memory. This problem was introduced in + // 8189925374e7ce3819bbe88b64c7b15abac96b16. I suspect that the error object + // causes a cyclic reference that the GC does not detect properly, but I was + // unable to produce a standalone version of this leak. This would be a great + // challenge for somebody interested in difficult problems : )! + this._callSite = null; + + // try...finally for exception safety + try { + if (err) { + this.emit('error', err); + } + } finally { + try { + if (this._callback) { + this._callback.apply(this, arguments); + } + } finally { + this.emit('end'); + } + } +}; + +Sequence.prototype['OkPacket'] = function(packet) { + this.end(null, packet); +}; + +Sequence.prototype['ErrorPacket'] = function(packet) { + this.end(this._packetToError(packet)); +}; + +// Implemented by child classes +Sequence.prototype.start = function() {}; + +Sequence.prototype._addLongStackTrace = function _addLongStackTrace(err) { + var callSiteStack = this._callSite && this._callSite.stack; + + if (!callSiteStack || typeof callSiteStack !== 'string') { + // No recorded call site + return; + } + + if (err.stack.indexOf(LONG_STACK_DELIMITER) !== -1) { + // Error stack already looks long + return; + } + + var index = callSiteStack.indexOf('\n'); + + if (index !== -1) { + // Append recorded call site + err.stack += LONG_STACK_DELIMITER + callSiteStack.substr(index + 1); + } +}; + +Sequence.prototype._onTimeout = function _onTimeout() { + this.emit('timeout'); +}; + + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + +module.exports = require("events"); + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + + + +/**/ + +var pna = __webpack_require__(10); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = __webpack_require__(6); +util.inherits = __webpack_require__(7); +/**/ + +var Readable = __webpack_require__(20); +var Writable = __webpack_require__(23); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; + +/***/ }), +/* 6 */ +/***/ (function(module, exports) { + +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. + +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = Buffer.isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +try { + var util = __webpack_require__(0); + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + module.exports = __webpack_require__(74); +} + + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +var Crypto = __webpack_require__(15); +var Events = __webpack_require__(4); +var Net = __webpack_require__(31); +var tls = __webpack_require__(32); +var ConnectionConfig = __webpack_require__(11); +var Protocol = __webpack_require__(35); +var SqlString = __webpack_require__(26); +var Query = __webpack_require__(19); +var Util = __webpack_require__(0); + +module.exports = Connection; +Util.inherits(Connection, Events.EventEmitter); +function Connection(options) { + Events.EventEmitter.call(this); + + this.config = options.config; + + this._socket = options.socket; + this._protocol = new Protocol({config: this.config, connection: this}); + this._connectCalled = false; + this.state = 'disconnected'; + this.threadId = null; +} + +Connection.createQuery = function createQuery(sql, values, callback) { + if (sql instanceof Query) { + return sql; + } + + var cb = wrapCallbackInDomain(null, callback); + var options = {}; + + if (typeof sql === 'function') { + cb = wrapCallbackInDomain(null, sql); + return new Query(options, cb); + } + + if (typeof sql === 'object') { + for (var prop in sql) { + options[prop] = sql[prop]; + } + + if (typeof values === 'function') { + cb = wrapCallbackInDomain(null, values); + } else if (values !== undefined) { + options.values = values; + } + + return new Query(options, cb); + } + + options.sql = sql; + options.values = values; + + if (typeof values === 'function') { + cb = wrapCallbackInDomain(null, values); + options.values = undefined; + } + + if (cb === undefined && callback !== undefined) { + throw new TypeError('argument callback must be a function when provided'); + } + + return new Query(options, cb); +}; + +Connection.prototype.connect = function connect(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + if (!this._connectCalled) { + this._connectCalled = true; + + // Connect either via a UNIX domain socket or a TCP socket. + this._socket = (this.config.socketPath) + ? Net.createConnection(this.config.socketPath) + : Net.createConnection(this.config.port, this.config.host); + + // Connect socket to connection domain + if (Events.usingDomains) { + this._socket.domain = this.domain; + } + + var connection = this; + this._protocol.on('data', function(data) { + connection._socket.write(data); + }); + this._socket.on('data', wrapToDomain(connection, function (data) { + connection._protocol.write(data); + })); + this._protocol.on('end', function() { + connection._socket.end(); + }); + this._socket.on('end', wrapToDomain(connection, function () { + connection._protocol.end(); + })); + + this._socket.on('error', this._handleNetworkError.bind(this)); + this._socket.on('connect', this._handleProtocolConnect.bind(this)); + this._protocol.on('handshake', this._handleProtocolHandshake.bind(this)); + this._protocol.on('unhandledError', this._handleProtocolError.bind(this)); + this._protocol.on('drain', this._handleProtocolDrain.bind(this)); + this._protocol.on('end', this._handleProtocolEnd.bind(this)); + this._protocol.on('enqueue', this._handleProtocolEnqueue.bind(this)); + + if (this.config.connectTimeout) { + var handleConnectTimeout = this._handleConnectTimeout.bind(this); + + this._socket.setTimeout(this.config.connectTimeout, handleConnectTimeout); + this._socket.once('connect', function() { + this.setTimeout(0, handleConnectTimeout); + }); + } + } + + this._protocol.handshake(options, wrapCallbackInDomain(this, callback)); +}; + +Connection.prototype.changeUser = function changeUser(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + this._implyConnect(); + + var charsetNumber = (options.charset) + ? ConnectionConfig.getCharsetNumber(options.charset) + : this.config.charsetNumber; + + return this._protocol.changeUser({ + user : options.user || this.config.user, + password : options.password || this.config.password, + database : options.database || this.config.database, + timeout : options.timeout, + charsetNumber : charsetNumber, + currentConfig : this.config + }, wrapCallbackInDomain(this, callback)); +}; + +Connection.prototype.beginTransaction = function beginTransaction(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + options.sql = 'START TRANSACTION'; + options.values = null; + + return this.query(options, callback); +}; + +Connection.prototype.commit = function commit(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + options.sql = 'COMMIT'; + options.values = null; + + return this.query(options, callback); +}; + +Connection.prototype.rollback = function rollback(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + options.sql = 'ROLLBACK'; + options.values = null; + + return this.query(options, callback); +}; + +Connection.prototype.query = function query(sql, values, cb) { + var query = Connection.createQuery(sql, values, cb); + query._connection = this; + + if (!(typeof sql === 'object' && 'typeCast' in sql)) { + query.typeCast = this.config.typeCast; + } + + if (query.sql) { + query.sql = this.format(query.sql, query.values); + } + + if (query._callback) { + query._callback = wrapCallbackInDomain(this, query._callback); + } + + this._implyConnect(); + + return this._protocol._enqueue(query); +}; + +Connection.prototype.ping = function ping(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + this._implyConnect(); + this._protocol.ping(options, wrapCallbackInDomain(this, callback)); +}; + +Connection.prototype.statistics = function statistics(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + this._implyConnect(); + this._protocol.stats(options, wrapCallbackInDomain(this, callback)); +}; + +Connection.prototype.end = function end(options, callback) { + var cb = callback; + var opts = options; + + if (!callback && typeof options === 'function') { + cb = options; + opts = null; + } + + // create custom options reference + opts = Object.create(opts || null); + + if (opts.timeout === undefined) { + // default timeout of 30 seconds + opts.timeout = 30000; + } + + this._implyConnect(); + this._protocol.quit(opts, wrapCallbackInDomain(this, cb)); +}; + +Connection.prototype.destroy = function() { + this.state = 'disconnected'; + this._implyConnect(); + this._socket.destroy(); + this._protocol.destroy(); +}; + +Connection.prototype.pause = function() { + this._socket.pause(); + this._protocol.pause(); +}; + +Connection.prototype.resume = function() { + this._socket.resume(); + this._protocol.resume(); +}; + +Connection.prototype.escape = function(value) { + return SqlString.escape(value, false, this.config.timezone); +}; + +Connection.prototype.escapeId = function escapeId(value) { + return SqlString.escapeId(value, false); +}; + +Connection.prototype.format = function(sql, values) { + if (typeof this.config.queryFormat === 'function') { + return this.config.queryFormat.call(this, sql, values, this.config.timezone); + } + return SqlString.format(sql, values, this.config.stringifyObjects, this.config.timezone); +}; + +if (tls.TLSSocket) { + // 0.11+ environment + Connection.prototype._startTLS = function _startTLS(onSecure) { + var connection = this; + var secureContext = tls.createSecureContext({ + ca : this.config.ssl.ca, + cert : this.config.ssl.cert, + ciphers : this.config.ssl.ciphers, + key : this.config.ssl.key, + passphrase : this.config.ssl.passphrase + }); + + // "unpipe" + this._socket.removeAllListeners('data'); + this._protocol.removeAllListeners('data'); + + // socket <-> encrypted + var rejectUnauthorized = this.config.ssl.rejectUnauthorized; + var secureEstablished = false; + var secureSocket = new tls.TLSSocket(this._socket, { + rejectUnauthorized : rejectUnauthorized, + requestCert : true, + secureContext : secureContext, + isServer : false + }); + + // error handler for secure socket + secureSocket.on('_tlsError', function(err) { + if (secureEstablished) { + connection._handleNetworkError(err); + } else { + onSecure(err); + } + }); + + // cleartext <-> protocol + secureSocket.pipe(this._protocol); + this._protocol.on('data', function(data) { + secureSocket.write(data); + }); + + secureSocket.on('secure', function() { + secureEstablished = true; + + onSecure(rejectUnauthorized ? this.ssl.verifyError() : null); + }); + + // start TLS communications + secureSocket._start(); + }; +} else { + // pre-0.11 environment + Connection.prototype._startTLS = function _startTLS(onSecure) { + // before TLS: + // _socket <-> _protocol + // after: + // _socket <-> securePair.encrypted <-> securePair.cleartext <-> _protocol + + var connection = this; + var credentials = Crypto.createCredentials({ + ca : this.config.ssl.ca, + cert : this.config.ssl.cert, + ciphers : this.config.ssl.ciphers, + key : this.config.ssl.key, + passphrase : this.config.ssl.passphrase + }); + + var rejectUnauthorized = this.config.ssl.rejectUnauthorized; + var secureEstablished = false; + var securePair = tls.createSecurePair(credentials, false, true, rejectUnauthorized); + + // error handler for secure pair + securePair.on('error', function(err) { + if (secureEstablished) { + connection._handleNetworkError(err); + } else { + onSecure(err); + } + }); + + // "unpipe" + this._socket.removeAllListeners('data'); + this._protocol.removeAllListeners('data'); + + // socket <-> encrypted + securePair.encrypted.pipe(this._socket); + this._socket.on('data', function(data) { + securePair.encrypted.write(data); + }); + + // cleartext <-> protocol + securePair.cleartext.pipe(this._protocol); + this._protocol.on('data', function(data) { + securePair.cleartext.write(data); + }); + + // secure established + securePair.on('secure', function() { + secureEstablished = true; + + if (!rejectUnauthorized) { + onSecure(); + return; + } + + var verifyError = this.ssl.verifyError(); + var err = verifyError; + + // node.js 0.6 support + if (typeof err === 'string') { + err = new Error(verifyError); + err.code = verifyError; + } + + onSecure(err); + }); + + // node.js 0.8 bug + securePair._cycle = securePair.cycle; + securePair.cycle = function cycle() { + if (this.ssl && this.ssl.error) { + this.error(); + } + + return this._cycle.apply(this, arguments); + }; + }; +} + +Connection.prototype._handleConnectTimeout = function() { + if (this._socket) { + this._socket.setTimeout(0); + this._socket.destroy(); + } + + var err = new Error('connect ETIMEDOUT'); + err.errorno = 'ETIMEDOUT'; + err.code = 'ETIMEDOUT'; + err.syscall = 'connect'; + + this._handleNetworkError(err); +}; + +Connection.prototype._handleNetworkError = function(err) { + this._protocol.handleNetworkError(err); +}; + +Connection.prototype._handleProtocolError = function(err) { + this.state = 'protocol_error'; + this.emit('error', err); +}; + +Connection.prototype._handleProtocolDrain = function() { + this.emit('drain'); +}; + +Connection.prototype._handleProtocolConnect = function() { + this.state = 'connected'; + this.emit('connect'); +}; + +Connection.prototype._handleProtocolHandshake = function _handleProtocolHandshake(packet) { + this.state = 'authenticated'; + this.threadId = packet.threadId; +}; + +Connection.prototype._handleProtocolEnd = function(err) { + this.state = 'disconnected'; + this.emit('end', err); +}; + +Connection.prototype._handleProtocolEnqueue = function _handleProtocolEnqueue(sequence) { + this.emit('enqueue', sequence); +}; + +Connection.prototype._implyConnect = function() { + if (!this._connectCalled) { + this.connect(); + } +}; + +function unwrapFromDomain(fn) { + return function () { + var domains = []; + var ret; + + while (process.domain) { + domains.shift(process.domain); + process.domain.exit(); + } + + try { + ret = fn.apply(this, arguments); + } finally { + for (var i = 0; i < domains.length; i++) { + domains[i].enter(); + } + } + + return ret; + }; +} + +function wrapCallbackInDomain(ee, fn) { + if (typeof fn !== 'function' || fn.domain) { + return fn; + } + + var domain = process.domain; + + if (domain) { + return domain.bind(fn); + } else if (ee) { + return unwrapFromDomain(wrapToDomain(ee, fn)); + } else { + return fn; + } +} + +function wrapToDomain(ee, fn) { + return function () { + if (Events.usingDomains && ee.domain) { + ee.domain.enter(); + fn.apply(this, arguments); + ee.domain.exit(); + } else { + fn.apply(this, arguments); + } + }; +} + + +/***/ }), +/* 9 */ +/***/ (function(module, exports) { + +// Manually extracted from mysql-5.5.23/include/mysql_com.h +exports.CLIENT_LONG_PASSWORD = 1; /* new more secure passwords */ +exports.CLIENT_FOUND_ROWS = 2; /* Found instead of affected rows */ +exports.CLIENT_LONG_FLAG = 4; /* Get all column flags */ +exports.CLIENT_CONNECT_WITH_DB = 8; /* One can specify db on connect */ +exports.CLIENT_NO_SCHEMA = 16; /* Don't allow database.table.column */ +exports.CLIENT_COMPRESS = 32; /* Can use compression protocol */ +exports.CLIENT_ODBC = 64; /* Odbc client */ +exports.CLIENT_LOCAL_FILES = 128; /* Can use LOAD DATA LOCAL */ +exports.CLIENT_IGNORE_SPACE = 256; /* Ignore spaces before '(' */ +exports.CLIENT_PROTOCOL_41 = 512; /* New 4.1 protocol */ +exports.CLIENT_INTERACTIVE = 1024; /* This is an interactive client */ +exports.CLIENT_SSL = 2048; /* Switch to SSL after handshake */ +exports.CLIENT_IGNORE_SIGPIPE = 4096; /* IGNORE sigpipes */ +exports.CLIENT_TRANSACTIONS = 8192; /* Client knows about transactions */ +exports.CLIENT_RESERVED = 16384; /* Old flag for 4.1 protocol */ +exports.CLIENT_SECURE_CONNECTION = 32768; /* New 4.1 authentication */ + +exports.CLIENT_MULTI_STATEMENTS = 65536; /* Enable/disable multi-stmt support */ +exports.CLIENT_MULTI_RESULTS = 131072; /* Enable/disable multi-results */ +exports.CLIENT_PS_MULTI_RESULTS = 262144; /* Multi-results in PS-protocol */ + +exports.CLIENT_PLUGIN_AUTH = 524288; /* Client supports plugin authentication */ + +exports.CLIENT_SSL_VERIFY_SERVER_CERT = 1073741824; +exports.CLIENT_REMEMBER_OPTIONS = 2147483648; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = { nextTick: nextTick }; +} else { + module.exports = process +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} + + + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +var urlParse = __webpack_require__(33).parse; +var ClientConstants = __webpack_require__(9); +var Charsets = __webpack_require__(16); +var SSLProfiles = null; + +module.exports = ConnectionConfig; +function ConnectionConfig(options) { + if (typeof options === 'string') { + options = ConnectionConfig.parseUrl(options); + } + + this.host = options.host || 'localhost'; + this.port = options.port || 3306; + this.localAddress = options.localAddress; + this.socketPath = options.socketPath; + this.user = options.user || undefined; + this.password = options.password || undefined; + this.database = options.database; + this.connectTimeout = (options.connectTimeout === undefined) + ? (10 * 1000) + : options.connectTimeout; + this.insecureAuth = options.insecureAuth || false; + this.supportBigNumbers = options.supportBigNumbers || false; + this.bigNumberStrings = options.bigNumberStrings || false; + this.dateStrings = options.dateStrings || false; + this.debug = options.debug; + this.trace = options.trace !== false; + this.stringifyObjects = options.stringifyObjects || false; + this.timezone = options.timezone || 'local'; + this.flags = options.flags || ''; + this.queryFormat = options.queryFormat; + this.pool = options.pool || undefined; + this.ssl = (typeof options.ssl === 'string') + ? ConnectionConfig.getSSLProfile(options.ssl) + : (options.ssl || false); + this.multipleStatements = options.multipleStatements || false; + this.typeCast = (options.typeCast === undefined) + ? true + : options.typeCast; + + if (this.timezone[0] === ' ') { + // "+" is a url encoded char for space so it + // gets translated to space when giving a + // connection string.. + this.timezone = '+' + this.timezone.substr(1); + } + + if (this.ssl) { + // Default rejectUnauthorized to true + this.ssl.rejectUnauthorized = this.ssl.rejectUnauthorized !== false; + } + + this.maxPacketSize = 0; + this.charsetNumber = (options.charset) + ? ConnectionConfig.getCharsetNumber(options.charset) + : options.charsetNumber || Charsets.UTF8_GENERAL_CI; + + // Set the client flags + var defaultFlags = ConnectionConfig.getDefaultFlags(options); + this.clientFlags = ConnectionConfig.mergeFlags(defaultFlags, options.flags); +} + +ConnectionConfig.mergeFlags = function mergeFlags(defaultFlags, userFlags) { + var allFlags = ConnectionConfig.parseFlagList(defaultFlags); + var newFlags = ConnectionConfig.parseFlagList(userFlags); + + // Merge the new flags + for (var flag in newFlags) { + if (allFlags[flag] !== false) { + allFlags[flag] = newFlags[flag]; + } + } + + // Build flags + var flags = 0x0; + for (var flag in allFlags) { + if (allFlags[flag]) { + // TODO: Throw here on some future release + flags |= ClientConstants['CLIENT_' + flag] || 0x0; + } + } + + return flags; +}; + +ConnectionConfig.getCharsetNumber = function getCharsetNumber(charset) { + var num = Charsets[charset.toUpperCase()]; + + if (num === undefined) { + throw new TypeError('Unknown charset \'' + charset + '\''); + } + + return num; +}; + +ConnectionConfig.getDefaultFlags = function getDefaultFlags(options) { + var defaultFlags = [ + '-COMPRESS', // Compression protocol *NOT* supported + '-CONNECT_ATTRS', // Does *NOT* send connection attributes in Protocol::HandshakeResponse41 + '+CONNECT_WITH_DB', // One can specify db on connect in Handshake Response Packet + '+FOUND_ROWS', // Send found rows instead of affected rows + '+IGNORE_SIGPIPE', // Don't issue SIGPIPE if network failures + '+IGNORE_SPACE', // Let the parser ignore spaces before '(' + '+LOCAL_FILES', // Can use LOAD DATA LOCAL + '+LONG_FLAG', // Longer flags in Protocol::ColumnDefinition320 + '+LONG_PASSWORD', // Use the improved version of Old Password Authentication + '+MULTI_RESULTS', // Can handle multiple resultsets for COM_QUERY + '+ODBC', // Special handling of ODBC behaviour + '-PLUGIN_AUTH', // Does *NOT* support auth plugins + '+PROTOCOL_41', // Uses the 4.1 protocol + '+PS_MULTI_RESULTS', // Can handle multiple resultsets for COM_STMT_EXECUTE + '+RESERVED', // Unused + '+SECURE_CONNECTION', // Supports Authentication::Native41 + '+TRANSACTIONS' // Expects status flags + ]; + + if (options && options.multipleStatements) { + // May send multiple statements per COM_QUERY and COM_STMT_PREPARE + defaultFlags.push('+MULTI_STATEMENTS'); + } + + return defaultFlags; +}; + +ConnectionConfig.getSSLProfile = function getSSLProfile(name) { + if (!SSLProfiles) { + SSLProfiles = __webpack_require__(34); + } + + var ssl = SSLProfiles[name]; + + if (ssl === undefined) { + throw new TypeError('Unknown SSL profile \'' + name + '\''); + } + + return ssl; +}; + +ConnectionConfig.parseFlagList = function parseFlagList(flagList) { + var allFlags = Object.create(null); + + if (!flagList) { + return allFlags; + } + + var flags = !Array.isArray(flagList) + ? String(flagList || '').toUpperCase().split(/\s*,+\s*/) + : flagList; + + for (var i = 0; i < flags.length; i++) { + var flag = flags[i]; + var offset = 1; + var state = flag[0]; + + if (state === undefined) { + // TODO: throw here on some future release + continue; + } + + if (state !== '-' && state !== '+') { + offset = 0; + state = '+'; + } + + allFlags[flag.substr(offset)] = state === '+'; + } + + return allFlags; +}; + +ConnectionConfig.parseUrl = function(url) { + url = urlParse(url, true); + + var options = { + host : url.hostname, + port : url.port, + database : url.pathname.substr(1) + }; + + if (url.auth) { + var auth = url.auth.split(':'); + options.user = auth.shift(); + options.password = auth.join(':'); + } + + if (url.query) { + for (var key in url.query) { + var value = url.query[key]; + + try { + // Try to parse this as a JSON expression first + options[key] = JSON.parse(value); + } catch (err) { + // Otherwise assume it is a plain string + options[key] = value; + } + } + } + + return options; +}; + + +/***/ }), +/* 12 */ +/***/ (function(module, exports) { + +// Manually extracted from mysql-5.7.9/include/mysql.h.pp +// some more info here: http://dev.mysql.com/doc/refman/5.5/en/c-api-prepared-statement-type-codes.html +exports.DECIMAL = 0x00; // aka DECIMAL (http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html) +exports.TINY = 0x01; // aka TINYINT, 1 byte +exports.SHORT = 0x02; // aka SMALLINT, 2 bytes +exports.LONG = 0x03; // aka INT, 4 bytes +exports.FLOAT = 0x04; // aka FLOAT, 4-8 bytes +exports.DOUBLE = 0x05; // aka DOUBLE, 8 bytes +exports.NULL = 0x06; // NULL (used for prepared statements, I think) +exports.TIMESTAMP = 0x07; // aka TIMESTAMP +exports.LONGLONG = 0x08; // aka BIGINT, 8 bytes +exports.INT24 = 0x09; // aka MEDIUMINT, 3 bytes +exports.DATE = 0x0a; // aka DATE +exports.TIME = 0x0b; // aka TIME +exports.DATETIME = 0x0c; // aka DATETIME +exports.YEAR = 0x0d; // aka YEAR, 1 byte (don't ask) +exports.NEWDATE = 0x0e; // aka ? +exports.VARCHAR = 0x0f; // aka VARCHAR (?) +exports.BIT = 0x10; // aka BIT, 1-8 byte +exports.TIMESTAMP2 = 0x11; // aka TIMESTAMP with fractional seconds +exports.DATETIME2 = 0x12; // aka DATETIME with fractional seconds +exports.TIME2 = 0x13; // aka TIME with fractional seconds +exports.JSON = 0xf5; // aka JSON +exports.NEWDECIMAL = 0xf6; // aka DECIMAL +exports.ENUM = 0xf7; // aka ENUM +exports.SET = 0xf8; // aka SET +exports.TINY_BLOB = 0xf9; // aka TINYBLOB, TINYTEXT +exports.MEDIUM_BLOB = 0xfa; // aka MEDIUMBLOB, MEDIUMTEXT +exports.LONG_BLOB = 0xfb; // aka LONGBLOG, LONGTEXT +exports.BLOB = 0xfc; // aka BLOB, TEXT +exports.VAR_STRING = 0xfd; // aka VARCHAR, VARBINARY +exports.STRING = 0xfe; // aka CHAR, BINARY +exports.GEOMETRY = 0xff; // aka GEOMETRY + + +/***/ }), +/* 13 */ +/***/ (function(module, exports) { + +module.exports = require("stream"); + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +var Classes = Object.create(null); + +/** + * Create a new Connection instance. + * @param {object|string} config Configuration or connection string for new MySQL connection + * @return {Connection} A new MySQL connection + * @public + */ +exports.createConnection = function createConnection(config) { + var Connection = loadClass('Connection'); + var ConnectionConfig = loadClass('ConnectionConfig'); + + return new Connection({config: new ConnectionConfig(config)}); +}; + +/** + * Create a new Pool instance. + * @param {object|string} config Configuration or connection string for new MySQL connections + * @return {Pool} A new MySQL pool + * @public + */ +exports.createPool = function createPool(config) { + var Pool = loadClass('Pool'); + var PoolConfig = loadClass('PoolConfig'); + + return new Pool({config: new PoolConfig(config)}); +}; + +/** + * Create a new PoolCluster instance. + * @param {object} [config] Configuration for pool cluster + * @return {PoolCluster} New MySQL pool cluster + * @public + */ +exports.createPoolCluster = function createPoolCluster(config) { + var PoolCluster = loadClass('PoolCluster'); + + return new PoolCluster(config); +}; + +/** + * Create a new Query instance. + * @param {string} sql The SQL for the query + * @param {array} [values] Any values to insert into placeholders in sql + * @param {function} [callback] The callback to use when query is complete + * @return {Query} New query object + * @public + */ +exports.createQuery = function createQuery(sql, values, callback) { + var Connection = loadClass('Connection'); + + return Connection.createQuery(sql, values, callback); +}; + +/** + * Escape a value for SQL. + * @param {*} value The value to escape + * @param {boolean} [stringifyObjects=false] Setting if objects should be stringified + * @param {string} [timeZone=local] Setting for time zone to use for Date conversion + * @return {string} Escaped string value + * @public + */ +exports.escape = function escape(value, stringifyObjects, timeZone) { + var SqlString = loadClass('SqlString'); + + return SqlString.escape(value, stringifyObjects, timeZone); +}; + +/** + * Escape an identifier for SQL. + * @param {*} value The value to escape + * @param {boolean} [forbidQualified=false] Setting to treat '.' as part of identifier + * @return {string} Escaped string value + * @public + */ +exports.escapeId = function escapeId(value, forbidQualified) { + var SqlString = loadClass('SqlString'); + + return SqlString.escapeId(value, forbidQualified); +}; + +/** + * Format SQL and replacement values into a SQL string. + * @param {string} sql The SQL for the query + * @param {array} [values] Any values to insert into placeholders in sql + * @param {boolean} [stringifyObjects=false] Setting if objects should be stringified + * @param {string} [timeZone=local] Setting for time zone to use for Date conversion + * @return {string} Formatted SQL string + * @public + */ +exports.format = function format(sql, values, stringifyObjects, timeZone) { + var SqlString = loadClass('SqlString'); + + return SqlString.format(sql, values, stringifyObjects, timeZone); +}; + +/** + * Wrap raw SQL strings from escape overriding. + * @param {string} sql The raw SQL + * @return {object} Wrapped object + * @public + */ +exports.raw = function raw(sql) { + var SqlString = loadClass('SqlString'); + + return SqlString.raw(sql); +}; + +/** + * The type constants. + * @public + */ +Object.defineProperty(exports, 'Types', { + get: loadClass.bind(null, 'Types') +}); + +/** + * Load the given class. + * @param {string} className Name of class to default + * @return {function|object} Class constructor or exports + * @private + */ +function loadClass(className) { + var Class = Classes[className]; + + if (Class !== undefined) { + return Class; + } + + // This uses a switch for static require analysis + switch (className) { + case 'Connection': + Class = __webpack_require__(8); + break; + case 'ConnectionConfig': + Class = __webpack_require__(11); + break; + case 'Pool': + Class = __webpack_require__(27); + break; + case 'PoolCluster': + Class = __webpack_require__(84); + break; + case 'PoolConfig': + Class = __webpack_require__(28); + break; + case 'SqlString': + Class = __webpack_require__(26); + break; + case 'Types': + Class = __webpack_require__(12); + break; + default: + throw new Error('Cannot find class \'' + className + '\''); + } + + // Store to prevent invoking require() + Classes[className] = Class; + + return Class; +} + + +/***/ }), +/* 15 */ +/***/ (function(module, exports) { + +module.exports = require("crypto"); + +/***/ }), +/* 16 */ +/***/ (function(module, exports) { + +exports.BIG5_CHINESE_CI = 1; +exports.LATIN2_CZECH_CS = 2; +exports.DEC8_SWEDISH_CI = 3; +exports.CP850_GENERAL_CI = 4; +exports.LATIN1_GERMAN1_CI = 5; +exports.HP8_ENGLISH_CI = 6; +exports.KOI8R_GENERAL_CI = 7; +exports.LATIN1_SWEDISH_CI = 8; +exports.LATIN2_GENERAL_CI = 9; +exports.SWE7_SWEDISH_CI = 10; +exports.ASCII_GENERAL_CI = 11; +exports.UJIS_JAPANESE_CI = 12; +exports.SJIS_JAPANESE_CI = 13; +exports.CP1251_BULGARIAN_CI = 14; +exports.LATIN1_DANISH_CI = 15; +exports.HEBREW_GENERAL_CI = 16; +exports.TIS620_THAI_CI = 18; +exports.EUCKR_KOREAN_CI = 19; +exports.LATIN7_ESTONIAN_CS = 20; +exports.LATIN2_HUNGARIAN_CI = 21; +exports.KOI8U_GENERAL_CI = 22; +exports.CP1251_UKRAINIAN_CI = 23; +exports.GB2312_CHINESE_CI = 24; +exports.GREEK_GENERAL_CI = 25; +exports.CP1250_GENERAL_CI = 26; +exports.LATIN2_CROATIAN_CI = 27; +exports.GBK_CHINESE_CI = 28; +exports.CP1257_LITHUANIAN_CI = 29; +exports.LATIN5_TURKISH_CI = 30; +exports.LATIN1_GERMAN2_CI = 31; +exports.ARMSCII8_GENERAL_CI = 32; +exports.UTF8_GENERAL_CI = 33; +exports.CP1250_CZECH_CS = 34; +exports.UCS2_GENERAL_CI = 35; +exports.CP866_GENERAL_CI = 36; +exports.KEYBCS2_GENERAL_CI = 37; +exports.MACCE_GENERAL_CI = 38; +exports.MACROMAN_GENERAL_CI = 39; +exports.CP852_GENERAL_CI = 40; +exports.LATIN7_GENERAL_CI = 41; +exports.LATIN7_GENERAL_CS = 42; +exports.MACCE_BIN = 43; +exports.CP1250_CROATIAN_CI = 44; +exports.UTF8MB4_GENERAL_CI = 45; +exports.UTF8MB4_BIN = 46; +exports.LATIN1_BIN = 47; +exports.LATIN1_GENERAL_CI = 48; +exports.LATIN1_GENERAL_CS = 49; +exports.CP1251_BIN = 50; +exports.CP1251_GENERAL_CI = 51; +exports.CP1251_GENERAL_CS = 52; +exports.MACROMAN_BIN = 53; +exports.UTF16_GENERAL_CI = 54; +exports.UTF16_BIN = 55; +exports.UTF16LE_GENERAL_CI = 56; +exports.CP1256_GENERAL_CI = 57; +exports.CP1257_BIN = 58; +exports.CP1257_GENERAL_CI = 59; +exports.UTF32_GENERAL_CI = 60; +exports.UTF32_BIN = 61; +exports.UTF16LE_BIN = 62; +exports.BINARY = 63; +exports.ARMSCII8_BIN = 64; +exports.ASCII_BIN = 65; +exports.CP1250_BIN = 66; +exports.CP1256_BIN = 67; +exports.CP866_BIN = 68; +exports.DEC8_BIN = 69; +exports.GREEK_BIN = 70; +exports.HEBREW_BIN = 71; +exports.HP8_BIN = 72; +exports.KEYBCS2_BIN = 73; +exports.KOI8R_BIN = 74; +exports.KOI8U_BIN = 75; +exports.LATIN2_BIN = 77; +exports.LATIN5_BIN = 78; +exports.LATIN7_BIN = 79; +exports.CP850_BIN = 80; +exports.CP852_BIN = 81; +exports.SWE7_BIN = 82; +exports.UTF8_BIN = 83; +exports.BIG5_BIN = 84; +exports.EUCKR_BIN = 85; +exports.GB2312_BIN = 86; +exports.GBK_BIN = 87; +exports.SJIS_BIN = 88; +exports.TIS620_BIN = 89; +exports.UCS2_BIN = 90; +exports.UJIS_BIN = 91; +exports.GEOSTD8_GENERAL_CI = 92; +exports.GEOSTD8_BIN = 93; +exports.LATIN1_SPANISH_CI = 94; +exports.CP932_JAPANESE_CI = 95; +exports.CP932_BIN = 96; +exports.EUCJPMS_JAPANESE_CI = 97; +exports.EUCJPMS_BIN = 98; +exports.CP1250_POLISH_CI = 99; +exports.UTF16_UNICODE_CI = 101; +exports.UTF16_ICELANDIC_CI = 102; +exports.UTF16_LATVIAN_CI = 103; +exports.UTF16_ROMANIAN_CI = 104; +exports.UTF16_SLOVENIAN_CI = 105; +exports.UTF16_POLISH_CI = 106; +exports.UTF16_ESTONIAN_CI = 107; +exports.UTF16_SPANISH_CI = 108; +exports.UTF16_SWEDISH_CI = 109; +exports.UTF16_TURKISH_CI = 110; +exports.UTF16_CZECH_CI = 111; +exports.UTF16_DANISH_CI = 112; +exports.UTF16_LITHUANIAN_CI = 113; +exports.UTF16_SLOVAK_CI = 114; +exports.UTF16_SPANISH2_CI = 115; +exports.UTF16_ROMAN_CI = 116; +exports.UTF16_PERSIAN_CI = 117; +exports.UTF16_ESPERANTO_CI = 118; +exports.UTF16_HUNGARIAN_CI = 119; +exports.UTF16_SINHALA_CI = 120; +exports.UTF16_GERMAN2_CI = 121; +exports.UTF16_CROATIAN_MYSQL561_CI = 122; +exports.UTF16_UNICODE_520_CI = 123; +exports.UTF16_VIETNAMESE_CI = 124; +exports.UCS2_UNICODE_CI = 128; +exports.UCS2_ICELANDIC_CI = 129; +exports.UCS2_LATVIAN_CI = 130; +exports.UCS2_ROMANIAN_CI = 131; +exports.UCS2_SLOVENIAN_CI = 132; +exports.UCS2_POLISH_CI = 133; +exports.UCS2_ESTONIAN_CI = 134; +exports.UCS2_SPANISH_CI = 135; +exports.UCS2_SWEDISH_CI = 136; +exports.UCS2_TURKISH_CI = 137; +exports.UCS2_CZECH_CI = 138; +exports.UCS2_DANISH_CI = 139; +exports.UCS2_LITHUANIAN_CI = 140; +exports.UCS2_SLOVAK_CI = 141; +exports.UCS2_SPANISH2_CI = 142; +exports.UCS2_ROMAN_CI = 143; +exports.UCS2_PERSIAN_CI = 144; +exports.UCS2_ESPERANTO_CI = 145; +exports.UCS2_HUNGARIAN_CI = 146; +exports.UCS2_SINHALA_CI = 147; +exports.UCS2_GERMAN2_CI = 148; +exports.UCS2_CROATIAN_MYSQL561_CI = 149; +exports.UCS2_UNICODE_520_CI = 150; +exports.UCS2_VIETNAMESE_CI = 151; +exports.UCS2_GENERAL_MYSQL500_CI = 159; +exports.UTF32_UNICODE_CI = 160; +exports.UTF32_ICELANDIC_CI = 161; +exports.UTF32_LATVIAN_CI = 162; +exports.UTF32_ROMANIAN_CI = 163; +exports.UTF32_SLOVENIAN_CI = 164; +exports.UTF32_POLISH_CI = 165; +exports.UTF32_ESTONIAN_CI = 166; +exports.UTF32_SPANISH_CI = 167; +exports.UTF32_SWEDISH_CI = 168; +exports.UTF32_TURKISH_CI = 169; +exports.UTF32_CZECH_CI = 170; +exports.UTF32_DANISH_CI = 171; +exports.UTF32_LITHUANIAN_CI = 172; +exports.UTF32_SLOVAK_CI = 173; +exports.UTF32_SPANISH2_CI = 174; +exports.UTF32_ROMAN_CI = 175; +exports.UTF32_PERSIAN_CI = 176; +exports.UTF32_ESPERANTO_CI = 177; +exports.UTF32_HUNGARIAN_CI = 178; +exports.UTF32_SINHALA_CI = 179; +exports.UTF32_GERMAN2_CI = 180; +exports.UTF32_CROATIAN_MYSQL561_CI = 181; +exports.UTF32_UNICODE_520_CI = 182; +exports.UTF32_VIETNAMESE_CI = 183; +exports.UTF8_UNICODE_CI = 192; +exports.UTF8_ICELANDIC_CI = 193; +exports.UTF8_LATVIAN_CI = 194; +exports.UTF8_ROMANIAN_CI = 195; +exports.UTF8_SLOVENIAN_CI = 196; +exports.UTF8_POLISH_CI = 197; +exports.UTF8_ESTONIAN_CI = 198; +exports.UTF8_SPANISH_CI = 199; +exports.UTF8_SWEDISH_CI = 200; +exports.UTF8_TURKISH_CI = 201; +exports.UTF8_CZECH_CI = 202; +exports.UTF8_DANISH_CI = 203; +exports.UTF8_LITHUANIAN_CI = 204; +exports.UTF8_SLOVAK_CI = 205; +exports.UTF8_SPANISH2_CI = 206; +exports.UTF8_ROMAN_CI = 207; +exports.UTF8_PERSIAN_CI = 208; +exports.UTF8_ESPERANTO_CI = 209; +exports.UTF8_HUNGARIAN_CI = 210; +exports.UTF8_SINHALA_CI = 211; +exports.UTF8_GERMAN2_CI = 212; +exports.UTF8_CROATIAN_MYSQL561_CI = 213; +exports.UTF8_UNICODE_520_CI = 214; +exports.UTF8_VIETNAMESE_CI = 215; +exports.UTF8_GENERAL_MYSQL500_CI = 223; +exports.UTF8MB4_UNICODE_CI = 224; +exports.UTF8MB4_ICELANDIC_CI = 225; +exports.UTF8MB4_LATVIAN_CI = 226; +exports.UTF8MB4_ROMANIAN_CI = 227; +exports.UTF8MB4_SLOVENIAN_CI = 228; +exports.UTF8MB4_POLISH_CI = 229; +exports.UTF8MB4_ESTONIAN_CI = 230; +exports.UTF8MB4_SPANISH_CI = 231; +exports.UTF8MB4_SWEDISH_CI = 232; +exports.UTF8MB4_TURKISH_CI = 233; +exports.UTF8MB4_CZECH_CI = 234; +exports.UTF8MB4_DANISH_CI = 235; +exports.UTF8MB4_LITHUANIAN_CI = 236; +exports.UTF8MB4_SLOVAK_CI = 237; +exports.UTF8MB4_SPANISH2_CI = 238; +exports.UTF8MB4_ROMAN_CI = 239; +exports.UTF8MB4_PERSIAN_CI = 240; +exports.UTF8MB4_ESPERANTO_CI = 241; +exports.UTF8MB4_HUNGARIAN_CI = 242; +exports.UTF8MB4_SINHALA_CI = 243; +exports.UTF8MB4_GERMAN2_CI = 244; +exports.UTF8MB4_CROATIAN_MYSQL561_CI = 245; +exports.UTF8MB4_UNICODE_520_CI = 246; +exports.UTF8MB4_VIETNAMESE_CI = 247; +exports.UTF8_GENERAL50_CI = 253; + +// short aliases +exports.ARMSCII8 = exports.ARMSCII8_GENERAL_CI; +exports.ASCII = exports.ASCII_GENERAL_CI; +exports.BIG5 = exports.BIG5_CHINESE_CI; +exports.BINARY = exports.BINARY; +exports.CP1250 = exports.CP1250_GENERAL_CI; +exports.CP1251 = exports.CP1251_GENERAL_CI; +exports.CP1256 = exports.CP1256_GENERAL_CI; +exports.CP1257 = exports.CP1257_GENERAL_CI; +exports.CP866 = exports.CP866_GENERAL_CI; +exports.CP850 = exports.CP850_GENERAL_CI; +exports.CP852 = exports.CP852_GENERAL_CI; +exports.CP932 = exports.CP932_JAPANESE_CI; +exports.DEC8 = exports.DEC8_SWEDISH_CI; +exports.EUCJPMS = exports.EUCJPMS_JAPANESE_CI; +exports.EUCKR = exports.EUCKR_KOREAN_CI; +exports.GB2312 = exports.GB2312_CHINESE_CI; +exports.GBK = exports.GBK_CHINESE_CI; +exports.GEOSTD8 = exports.GEOSTD8_GENERAL_CI; +exports.GREEK = exports.GREEK_GENERAL_CI; +exports.HEBREW = exports.HEBREW_GENERAL_CI; +exports.HP8 = exports.HP8_ENGLISH_CI; +exports.KEYBCS2 = exports.KEYBCS2_GENERAL_CI; +exports.KOI8R = exports.KOI8R_GENERAL_CI; +exports.KOI8U = exports.KOI8U_GENERAL_CI; +exports.LATIN1 = exports.LATIN1_SWEDISH_CI; +exports.LATIN2 = exports.LATIN2_GENERAL_CI; +exports.LATIN5 = exports.LATIN5_TURKISH_CI; +exports.LATIN7 = exports.LATIN7_GENERAL_CI; +exports.MACCE = exports.MACCE_GENERAL_CI; +exports.MACROMAN = exports.MACROMAN_GENERAL_CI; +exports.SJIS = exports.SJIS_JAPANESE_CI; +exports.SWE7 = exports.SWE7_SWEDISH_CI; +exports.TIS620 = exports.TIS620_THAI_CI; +exports.UCS2 = exports.UCS2_GENERAL_CI; +exports.UJIS = exports.UJIS_JAPANESE_CI; +exports.UTF16 = exports.UTF16_GENERAL_CI; +exports.UTF16LE = exports.UTF16LE_GENERAL_CI; +exports.UTF8 = exports.UTF8_GENERAL_CI; +exports.UTF8MB4 = exports.UTF8MB4_GENERAL_CI; +exports.UTF32 = exports.UTF32_GENERAL_CI; + + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +var Types = __webpack_require__(12); + +module.exports = Field; +function Field(options) { + options = options || {}; + + this.parser = options.parser; + this.packet = options.packet; + this.db = options.packet.db; + this.table = options.packet.table; + this.name = options.packet.name; + this.type = typeToString(options.packet.type); + this.length = options.packet.length; +} + +Field.prototype.string = function () { + return this.parser.parseLengthCodedString(); +}; + +Field.prototype.buffer = function () { + return this.parser.parseLengthCodedBuffer(); +}; + +Field.prototype.geometry = function () { + return this.parser.parseGeometryValue(); +}; + +function typeToString(t) { + for (var k in Types) { + if (Types[k] === t) return k; + } + + return undefined; +} + + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +var Buffer = __webpack_require__(1).Buffer; +var Crypto = __webpack_require__(15); +var Auth = exports; + +function sha1(msg) { + var hash = Crypto.createHash('sha1'); + hash.update(msg, 'binary'); + return hash.digest('binary'); +} +Auth.sha1 = sha1; + +function xor(a, b) { + a = Buffer.from(a, 'binary'); + b = Buffer.from(b, 'binary'); + var result = Buffer.allocUnsafe(a.length); + for (var i = 0; i < a.length; i++) { + result[i] = (a[i] ^ b[i]); + } + return result; +} +Auth.xor = xor; + +Auth.token = function(password, scramble) { + if (!password) { + return Buffer.alloc(0); + } + + // password must be in binary format, not utf8 + var stage1 = sha1((Buffer.from(password, 'utf8')).toString('binary')); + var stage2 = sha1(stage1); + var stage3 = sha1(scramble.toString('binary') + stage2); + return xor(stage3, stage1); +}; + +// This is a port of sql/password.c:hash_password which needs to be used for +// pre-4.1 passwords. +Auth.hashPassword = function(password) { + var nr = [0x5030, 0x5735]; + var add = 7; + var nr2 = [0x1234, 0x5671]; + var result = Buffer.alloc(8); + + if (typeof password === 'string'){ + password = Buffer.from(password); + } + + for (var i = 0; i < password.length; i++) { + var c = password[i]; + if (c === 32 || c === 9) { + // skip space in password + continue; + } + + // nr^= (((nr & 63)+add)*c)+ (nr << 8); + // nr = xor(nr, add(mul(add(and(nr, 63), add), c), shl(nr, 8))) + nr = this.xor32(nr, this.add32(this.mul32(this.add32(this.and32(nr, [0, 63]), [0, add]), [0, c]), this.shl32(nr, 8))); + + // nr2+=(nr2 << 8) ^ nr; + // nr2 = add(nr2, xor(shl(nr2, 8), nr)) + nr2 = this.add32(nr2, this.xor32(this.shl32(nr2, 8), nr)); + + // add+=tmp; + add += c; + } + + this.int31Write(result, nr, 0); + this.int31Write(result, nr2, 4); + + return result; +}; + +Auth.randomInit = function(seed1, seed2) { + return { + max_value : 0x3FFFFFFF, + max_value_dbl : 0x3FFFFFFF, + seed1 : seed1 % 0x3FFFFFFF, + seed2 : seed2 % 0x3FFFFFFF + }; +}; + +Auth.myRnd = function(r){ + r.seed1 = (r.seed1 * 3 + r.seed2) % r.max_value; + r.seed2 = (r.seed1 + r.seed2 + 33) % r.max_value; + + return r.seed1 / r.max_value_dbl; +}; + +Auth.scramble323 = function(message, password) { + var to = Buffer.allocUnsafe(8); + var hashPass = this.hashPassword(password); + var hashMessage = this.hashPassword(message.slice(0, 8)); + var seed1 = this.int32Read(hashPass, 0) ^ this.int32Read(hashMessage, 0); + var seed2 = this.int32Read(hashPass, 4) ^ this.int32Read(hashMessage, 4); + var r = this.randomInit(seed1, seed2); + + for (var i = 0; i < 8; i++){ + to[i] = Math.floor(this.myRnd(r) * 31) + 64; + } + var extra = (Math.floor(this.myRnd(r) * 31)); + + for (var i = 0; i < 8; i++){ + to[i] ^= extra; + } + + return to; +}; + +Auth.xor32 = function(a, b){ + return [a[0] ^ b[0], a[1] ^ b[1]]; +}; + +Auth.add32 = function(a, b){ + var w1 = a[1] + b[1]; + var w2 = a[0] + b[0] + ((w1 & 0xFFFF0000) >> 16); + + return [w2 & 0xFFFF, w1 & 0xFFFF]; +}; + +Auth.mul32 = function(a, b){ + // based on this example of multiplying 32b ints using 16b + // http://www.dsprelated.com/showmessage/89790/1.php + var w1 = a[1] * b[1]; + var w2 = (((a[1] * b[1]) >> 16) & 0xFFFF) + ((a[0] * b[1]) & 0xFFFF) + (a[1] * b[0] & 0xFFFF); + + return [w2 & 0xFFFF, w1 & 0xFFFF]; +}; + +Auth.and32 = function(a, b){ + return [a[0] & b[0], a[1] & b[1]]; +}; + +Auth.shl32 = function(a, b){ + // assume b is 16 or less + var w1 = a[1] << b; + var w2 = (a[0] << b) | ((w1 & 0xFFFF0000) >> 16); + + return [w2 & 0xFFFF, w1 & 0xFFFF]; +}; + +Auth.int31Write = function(buffer, number, offset) { + buffer[offset] = (number[0] >> 8) & 0x7F; + buffer[offset + 1] = (number[0]) & 0xFF; + buffer[offset + 2] = (number[1] >> 8) & 0xFF; + buffer[offset + 3] = (number[1]) & 0xFF; +}; + +Auth.int32Read = function(buffer, offset){ + return (buffer[offset] << 24) + + (buffer[offset + 1] << 16) + + (buffer[offset + 2] << 8) + + (buffer[offset + 3]); +}; + + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +var Sequence = __webpack_require__(3); +var Util = __webpack_require__(0); +var Packets = __webpack_require__(2); +var ResultSet = __webpack_require__(69); +var ServerStatus = __webpack_require__(70); +var fs = __webpack_require__(71); +var Readable = __webpack_require__(72); + +module.exports = Query; +Util.inherits(Query, Sequence); +function Query(options, callback) { + Sequence.call(this, options, callback); + + this.sql = options.sql; + this.values = options.values; + this.typeCast = (options.typeCast === undefined) + ? true + : options.typeCast; + this.nestTables = options.nestTables || false; + + this._resultSet = null; + this._results = []; + this._fields = []; + this._index = 0; + this._loadError = null; +} + +Query.prototype.start = function() { + this.emit('packet', new Packets.ComQueryPacket(this.sql)); +}; + +Query.prototype.determinePacket = function determinePacket(byte, parser) { + var resultSet = this._resultSet; + + if (!resultSet) { + switch (byte) { + case 0x00: return Packets.OkPacket; + case 0xff: return Packets.ErrorPacket; + default: return Packets.ResultSetHeaderPacket; + } + } + + if (resultSet.eofPackets.length === 0) { + return (resultSet.fieldPackets.length < resultSet.resultSetHeaderPacket.fieldCount) + ? Packets.FieldPacket + : Packets.EofPacket; + } + + if (byte === 0xff) { + return Packets.ErrorPacket; + } + + if (byte === 0xfe && parser.packetLength() < 9) { + return Packets.EofPacket; + } + + return Packets.RowDataPacket; +}; + +Query.prototype['OkPacket'] = function(packet) { + // try...finally for exception safety + try { + if (!this._callback) { + this.emit('result', packet, this._index); + } else { + this._results.push(packet); + this._fields.push(undefined); + } + } finally { + this._index++; + this._resultSet = null; + this._handleFinalResultPacket(packet); + } +}; + +Query.prototype['ErrorPacket'] = function(packet) { + var err = this._packetToError(packet); + + var results = (this._results.length > 0) + ? this._results + : undefined; + + var fields = (this._fields.length > 0) + ? this._fields + : undefined; + + err.index = this._index; + err.sql = this.sql; + + this.end(err, results, fields); +}; + +Query.prototype['ResultSetHeaderPacket'] = function(packet) { + if (packet.fieldCount === null) { + this._sendLocalDataFile(packet.extra); + } else { + this._resultSet = new ResultSet(packet); + } +}; + +Query.prototype['FieldPacket'] = function(packet) { + this._resultSet.fieldPackets.push(packet); +}; + +Query.prototype['EofPacket'] = function(packet) { + this._resultSet.eofPackets.push(packet); + + if (this._resultSet.eofPackets.length === 1 && !this._callback) { + this.emit('fields', this._resultSet.fieldPackets, this._index); + } + + if (this._resultSet.eofPackets.length !== 2) { + return; + } + + if (this._callback) { + this._results.push(this._resultSet.rows); + this._fields.push(this._resultSet.fieldPackets); + } + + this._index++; + this._resultSet = null; + this._handleFinalResultPacket(packet); +}; + +Query.prototype._handleFinalResultPacket = function(packet) { + if (packet.serverStatus & ServerStatus.SERVER_MORE_RESULTS_EXISTS) { + return; + } + + var results = (this._results.length > 1) + ? this._results + : this._results[0]; + + var fields = (this._fields.length > 1) + ? this._fields + : this._fields[0]; + + this.end(this._loadError, results, fields); +}; + +Query.prototype['RowDataPacket'] = function(packet, parser, connection) { + packet.parse(parser, this._resultSet.fieldPackets, this.typeCast, this.nestTables, connection); + + if (this._callback) { + this._resultSet.rows.push(packet); + } else { + this.emit('result', packet, this._index); + } +}; + +Query.prototype._sendLocalDataFile = function(path) { + var self = this; + var localStream = fs.createReadStream(path, { + flag : 'r', + encoding : null, + autoClose : true + }); + + this.on('pause', function () { + localStream.pause(); + }); + + this.on('resume', function () { + localStream.resume(); + }); + + localStream.on('data', function (data) { + self.emit('packet', new Packets.LocalDataFilePacket(data)); + }); + + localStream.on('error', function (err) { + self._loadError = err; + localStream.emit('end'); + }); + + localStream.on('end', function () { + self.emit('packet', new Packets.EmptyPacket()); + }); +}; + +Query.prototype.stream = function(options) { + var self = this; + + options = options || {}; + options.objectMode = true; + + var stream = new Readable(options); + + stream._read = function() { + self._connection && self._connection.resume(); + }; + + stream.once('end', function() { + process.nextTick(function () { + stream.emit('close'); + }); + }); + + this.on('result', function(row, i) { + if (!stream.push(row)) self._connection.pause(); + stream.emit('result', row, i); // replicate old emitter + }); + + this.on('error', function(err) { + stream.emit('error', err); // Pass on any errors + }); + + this.on('end', function() { + stream.push(null); // pushing null, indicating EOF + }); + + this.on('fields', function(fields, i) { + stream.emit('fields', fields, i); // replicate old emitter + }); + + return stream; +}; + + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +/**/ + +var pna = __webpack_require__(10); +/**/ + +module.exports = Readable; + +/**/ +var isArray = __webpack_require__(73); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = __webpack_require__(4).EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = __webpack_require__(21); +/**/ + +/**/ + +var Buffer = __webpack_require__(1).Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = __webpack_require__(6); +util.inherits = __webpack_require__(7); +/**/ + +/**/ +var debugUtil = __webpack_require__(0); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = __webpack_require__(75); +var destroyImpl = __webpack_require__(22); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || __webpack_require__(5); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = __webpack_require__(24).StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || __webpack_require__(5); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = __webpack_require__(24).StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(13); + + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/**/ + +var pna = __webpack_require__(10); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + + + +/**/ + +var pna = __webpack_require__(10); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = __webpack_require__(6); +util.inherits = __webpack_require__(7); +/**/ + +/**/ +var internalUtil = { + deprecate: __webpack_require__(76) +}; +/**/ + +/**/ +var Stream = __webpack_require__(21); +/**/ + +/**/ + +var Buffer = __webpack_require__(1).Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = __webpack_require__(22); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || __webpack_require__(5); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || __webpack_require__(5); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +/**/ + +var Buffer = __webpack_require__(1).Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + + + +module.exports = Transform; + +var Duplex = __webpack_require__(5); + +/**/ +var util = __webpack_require__(6); +util.inherits = __webpack_require__(7); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(81); + + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +var mysql = __webpack_require__(14); +var Connection = __webpack_require__(8); +var EventEmitter = __webpack_require__(4).EventEmitter; +var Util = __webpack_require__(0); +var PoolConnection = __webpack_require__(83); + +module.exports = Pool; + +Util.inherits(Pool, EventEmitter); +function Pool(options) { + EventEmitter.call(this); + this.config = options.config; + this.config.connectionConfig.pool = this; + + this._acquiringConnections = []; + this._allConnections = []; + this._freeConnections = []; + this._connectionQueue = []; + this._closed = false; +} + +Pool.prototype.getConnection = function (cb) { + + if (this._closed) { + var err = new Error('Pool is closed.'); + err.code = 'POOL_CLOSED'; + process.nextTick(function () { + cb(err); + }); + return; + } + + var connection; + var pool = this; + + if (this._freeConnections.length > 0) { + connection = this._freeConnections.shift(); + this.acquireConnection(connection, cb); + return; + } + + if (this.config.connectionLimit === 0 || this._allConnections.length < this.config.connectionLimit) { + connection = new PoolConnection(this, { config: this.config.newConnectionConfig() }); + + this._acquiringConnections.push(connection); + this._allConnections.push(connection); + + connection.connect({timeout: this.config.acquireTimeout}, function onConnect(err) { + spliceConnection(pool._acquiringConnections, connection); + + if (pool._closed) { + err = new Error('Pool is closed.'); + err.code = 'POOL_CLOSED'; + } + + if (err) { + pool._purgeConnection(connection); + cb(err); + return; + } + + pool.emit('connection', connection); + pool.emit('acquire', connection); + cb(null, connection); + }); + return; + } + + if (!this.config.waitForConnections) { + process.nextTick(function(){ + var err = new Error('No connections available.'); + err.code = 'POOL_CONNLIMIT'; + cb(err); + }); + return; + } + + this._enqueueCallback(cb); +}; + +Pool.prototype.acquireConnection = function acquireConnection(connection, cb) { + if (connection._pool !== this) { + throw new Error('Connection acquired from wrong pool.'); + } + + var changeUser = this._needsChangeUser(connection); + var pool = this; + + this._acquiringConnections.push(connection); + + function onOperationComplete(err) { + spliceConnection(pool._acquiringConnections, connection); + + if (pool._closed) { + err = new Error('Pool is closed.'); + err.code = 'POOL_CLOSED'; + } + + if (err) { + pool._connectionQueue.unshift(cb); + pool._purgeConnection(connection); + return; + } + + if (changeUser) { + pool.emit('connection', connection); + } + + pool.emit('acquire', connection); + cb(null, connection); + } + + if (changeUser) { + // restore user back to pool configuration + connection.config = this.config.newConnectionConfig(); + connection.changeUser({timeout: this.config.acquireTimeout}, onOperationComplete); + } else { + // ping connection + connection.ping({timeout: this.config.acquireTimeout}, onOperationComplete); + } +}; + +Pool.prototype.releaseConnection = function releaseConnection(connection) { + + if (this._acquiringConnections.indexOf(connection) !== -1) { + // connection is being acquired + return; + } + + if (connection._pool) { + if (connection._pool !== this) { + throw new Error('Connection released to wrong pool'); + } + + if (this._freeConnections.indexOf(connection) !== -1) { + // connection already in free connection pool + // this won't catch all double-release cases + throw new Error('Connection already released'); + } else { + // add connection to end of free queue + this._freeConnections.push(connection); + this.emit('release', connection); + } + } + + if (this._closed) { + // empty the connection queue + this._connectionQueue.splice(0).forEach(function (cb) { + var err = new Error('Pool is closed.'); + err.code = 'POOL_CLOSED'; + process.nextTick(function () { + cb(err); + }); + }); + } else if (this._connectionQueue.length) { + // get connection with next waiting callback + this.getConnection(this._connectionQueue.shift()); + } +}; + +Pool.prototype.end = function (cb) { + this._closed = true; + + if (typeof cb !== 'function') { + cb = function (err) { + if (err) throw err; + }; + } + + var calledBack = false; + var waitingClose = 0; + + function onEnd(err) { + if (!calledBack && (err || --waitingClose <= 0)) { + calledBack = true; + cb(err); + } + } + + while (this._allConnections.length !== 0) { + waitingClose++; + this._purgeConnection(this._allConnections[0], onEnd); + } + + if (waitingClose === 0) { + process.nextTick(onEnd); + } +}; + +Pool.prototype.query = function (sql, values, cb) { + var query = Connection.createQuery(sql, values, cb); + + if (!(typeof sql === 'object' && 'typeCast' in sql)) { + query.typeCast = this.config.connectionConfig.typeCast; + } + + if (this.config.connectionConfig.trace) { + // Long stack trace support + query._callSite = new Error(); + } + + this.getConnection(function (err, conn) { + if (err) { + query.on('error', function () {}); + query.end(err); + return; + } + + // Release connection based off event + query.once('end', function() { + conn.release(); + }); + + conn.query(query); + }); + + return query; +}; + +Pool.prototype._enqueueCallback = function _enqueueCallback(callback) { + + if (this.config.queueLimit && this._connectionQueue.length >= this.config.queueLimit) { + process.nextTick(function () { + var err = new Error('Queue limit reached.'); + err.code = 'POOL_ENQUEUELIMIT'; + callback(err); + }); + return; + } + + // Bind to domain, as dequeue will likely occur in a different domain + var cb = process.domain + ? process.domain.bind(callback) + : callback; + + this._connectionQueue.push(cb); + this.emit('enqueue'); +}; + +Pool.prototype._needsChangeUser = function _needsChangeUser(connection) { + var connConfig = connection.config; + var poolConfig = this.config.connectionConfig; + + // check if changeUser values are different + return connConfig.user !== poolConfig.user + || connConfig.database !== poolConfig.database + || connConfig.password !== poolConfig.password + || connConfig.charsetNumber !== poolConfig.charsetNumber; +}; + +Pool.prototype._purgeConnection = function _purgeConnection(connection, callback) { + var cb = callback || function () {}; + + if (connection.state === 'disconnected') { + connection.destroy(); + } + + this._removeConnection(connection); + + if (connection.state !== 'disconnected' && !connection._protocol._quitSequence) { + connection._realEnd(cb); + return; + } + + process.nextTick(cb); +}; + +Pool.prototype._removeConnection = function(connection) { + connection._pool = null; + + // Remove connection from all connections + spliceConnection(this._allConnections, connection); + + // Remove connection from free connections + spliceConnection(this._freeConnections, connection); + + this.releaseConnection(connection); +}; + +Pool.prototype.escape = function(value) { + return mysql.escape(value, this.config.connectionConfig.stringifyObjects, this.config.connectionConfig.timezone); +}; + +Pool.prototype.escapeId = function escapeId(value) { + return mysql.escapeId(value, false); +}; + +function spliceConnection(array, connection) { + var index; + if ((index = array.indexOf(connection)) !== -1) { + // Remove connection from all connections + array.splice(index, 1); + } +} + + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + + +var ConnectionConfig = __webpack_require__(11); + +module.exports = PoolConfig; +function PoolConfig(options) { + if (typeof options === 'string') { + options = ConnectionConfig.parseUrl(options); + } + + this.acquireTimeout = (options.acquireTimeout === undefined) + ? 10 * 1000 + : Number(options.acquireTimeout); + this.connectionConfig = new ConnectionConfig(options); + this.waitForConnections = (options.waitForConnections === undefined) + ? true + : Boolean(options.waitForConnections); + this.connectionLimit = (options.connectionLimit === undefined) + ? 10 + : Number(options.connectionLimit); + this.queueLimit = (options.queueLimit === undefined) + ? 0 + : Number(options.queueLimit); +} + +PoolConfig.prototype.newConnectionConfig = function newConnectionConfig() { + var connectionConfig = new ConnectionConfig(this.connectionConfig); + + connectionConfig.clientFlags = this.connectionConfig.clientFlags; + connectionConfig.maxPacketSize = this.connectionConfig.maxPacketSize; + + return connectionConfig; +}; + + +/***/ }), +/* 29 */ +/***/ (function(module, exports) { + + +/** + * PoolSelector + */ +var PoolSelector = module.exports = {}; + +PoolSelector.RR = function PoolSelectorRoundRobin() { + var index = 0; + + return function(clusterIds) { + if (index >= clusterIds.length) { + index = 0; + } + + var clusterId = clusterIds[index++]; + + return clusterId; + }; +}; + +PoolSelector.RANDOM = function PoolSelectorRandom() { + return function(clusterIds) { + return clusterIds[Math.floor(Math.random() * clusterIds.length)]; + }; +}; + +PoolSelector.ORDER = function PoolSelectorOrder() { + return function(clusterIds) { + return clusterIds[0]; + }; +}; + + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +const mysql = __webpack_require__(14); + +let config = {}; +let debug = 0; +let pool; + +function prepareQuery(query, parameters) { + let sql = query; + if (parameters !== null && typeof parameters === 'object') { + sql = query.replace(/@(\w+)/g, (txt, key) => { + if (parameters.hasOwnProperty(key)) { + return mysql.escape(parameters[key]); + } else if (parameters.hasOwnProperty(`@${key}`)) { + return mysql.escape(parameters[`@${key}`]); + } + return txt; + }); + } + return sql; +} + +function writeDebug(time, sql, error) { + if (error) console.log(`[ERROR] [MySQL] An error happens on MySQL for query "${sql}": ${error.message}`) + if (debug) console.log(`[MySQL] [${(time[0]*1e3+time[1]*1e-6).toFixed()}ms] ${sql}`); +} + +async function safeInvoke(callback, args) { + if (typeof callback === 'function') setImmediate(() => { + callback(args); + }); +} + +// transform tinyint(1) to boolean +function useBoolean(fields, results) { + if (fields) { + fields.forEach(field => { + // found a column with tinyint(1) + if (field.type === 1 && field.length === 1) { + results.forEach((_, index) => { + results[index][field.name] = (results[index][field.name] !== 0); + }); + } + }); + } + return results; +} + +global.exports('mysql_execute', (query, parameters, callback) => { + let sql = prepareQuery(query, parameters); + let start = process.hrtime(); + pool.query(sql, (error, results) => { + writeDebug(process.hrtime(start), sql, error); + safeInvoke(callback, (results) ? results.affectedRows : 0); + }); +}); + +global.exports('mysql_fetch_all', (query, parameters, callback) => { + let sql = prepareQuery(query, parameters); + let start = process.hrtime(); + pool.query(sql, (error, results, fields) => { + writeDebug(process.hrtime(start), sql, error); + results = useBoolean(fields, results); + safeInvoke(callback, results); + }); +}); + +global.exports('mysql_fetch_scalar', (query, parameters, callback) => { + let sql = prepareQuery(query, parameters); + let start = process.hrtime(); + pool.query(sql, (error, results, fields) => { + writeDebug(process.hrtime(start), sql, error); + results = useBoolean(fields, results); + safeInvoke(callback, (results) ? Object.values(results[0])[0] : null); + }); +}); + +global.exports('mysql_insert', (query, parameters, callback) => { + let sql = prepareQuery(query, parameters); + let start = process.hrtime(); + pool.query(sql, (error, results) => { + writeDebug(process.hrtime(start), sql, error); + safeInvoke(callback, (results) ? results.insertId : 0); + }); +}); + +function parseOptions(config, options) { + const cfg = config; + const opts = options.split('&'); + opts.forEach((o) => { + const keyValue = o.split('='); + cfg[keyValue[0]] = keyValue[1]; + }); + return cfg; +} + +function parseConnectingString(connectionString) { + if(/(?:database|initial\scatalog)=(?:(.*?);|(.*))/gi.test(connectionString)) { + + let matches = (/(?:host|server|data\s?source|addr(?:ess)?)=(?:(.*?);|(.*))/gi.exec(connectionString)); + const host = (matches) ? matches[1] || matches[2] : 'localhost'; + matches = (/(?:Port)=(?:(.*?);|(.*))/gi.exec(connectionString)); + const port = (matches) ? matches[1] || matches[2] : 3306; + matches = (/(?:user\s?(?:id|name)?|uid)=(?:(.*?);|(.*))/gi.exec(connectionString)); + const user = (matches) ? matches[1] || matches[2] : 'root'; + matches = (/(?:password|pwd)=(?:(.*?);|(.*))/gi.exec(connectionString)); + const password = (matches) ? matches[1] || matches[2] : ''; + matches = (/(?:database|initial\scatalog)=(?:(.*?);|(.*))/gi.exec(connectionString)); + const database = (matches) ? matches[1] || matches[2] : ''; + return { host, port, user, password, database, dateStrings: true }; + + } else if(/mysql:\/\//gi.test(connectionString)) { + + let matches = /mysql:\/\/(.*?)(?::|@)(?:(.*)@)?(.*?)(?::(\d{1,5}))?\/(.*?)\?(.*)/gi.exec(connectionString); + const host = (matches[3]) ? matches[3] : 'localhost'; + const port = (matches[4]) ? matches[4] : 3306; + const user = (matches[1]) ? matches[1] : 'root'; + const password = (matches[2]) ? matches[2] : ''; + const database = (matches[5]) ? matches[5] : ''; + const config = { host, port, user, password, database }; + const options = matches[6]; + return parseOptions(config, options); + + } else throw new Error('No valid connection string found'); +} + +let isReady = false; +global.on('onServerResourceStart', (resourcename) => { + if (resourcename == 'mysql-async') { + const connectionString = global.GetConvar('mysql_connection_string', 'mysql://localhost/'); + config = parseConnectingString(connectionString); + debug = global.GetConvarInt('mysql_debug', 0); + pool = mysql.createPool(config); + global.emit('onMySQLReady'); // avoid ESX bugs + isReady = true; + } + if (isReady) { + global.emit('MySQLReady'); // avoid ESX bugs + } +}); + + +/***/ }), +/* 31 */ +/***/ (function(module, exports) { + +module.exports = require("net"); + +/***/ }), +/* 32 */ +/***/ (function(module, exports) { + +module.exports = require("tls"); + +/***/ }), +/* 33 */ +/***/ (function(module, exports) { + +module.exports = require("url"); + +/***/ }), +/* 34 */ +/***/ (function(module, exports) { + +// Certificates for Amazon RDS +exports['Amazon RDS'] = { + ca: [ + /** + * Amazon RDS global certificate 2010 to 2015 + * + * CN = aws.amazon.com/rds/ + * OU = RDS + * O = Amazon.com + * L = Seattle + * ST = Washington + * C = US + * P = 2010-04-05T22:44:31Z/2015-04-04T22:41:31Z + * F = 7F:09:8D:A5:7D:BB:A6:EF:7C:70:D8:CA:4E:49:11:55:7E:89:A7:D3 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIDQzCCAqygAwIBAgIJAOd1tlfiGoEoMA0GCSqGSIb3DQEBBQUAMHUxCzAJBgNV\n' + + 'BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdTZWF0dGxlMRMw\n' + + 'EQYDVQQKEwpBbWF6b24uY29tMQwwCgYDVQQLEwNSRFMxHDAaBgNVBAMTE2F3cy5h\n' + + 'bWF6b24uY29tL3Jkcy8wHhcNMTAwNDA1MjI0NDMxWhcNMTUwNDA0MjI0NDMxWjB1\n' + + 'MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHU2Vh\n' + + 'dHRsZTETMBEGA1UEChMKQW1hem9uLmNvbTEMMAoGA1UECxMDUkRTMRwwGgYDVQQD\n' + + 'ExNhd3MuYW1hem9uLmNvbS9yZHMvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n' + + 'gQDKhXGU7tizxUR5WaFoMTFcxNxa05PEjZaIOEN5ctkWrqYSRov0/nOMoZjqk8bC\n' + + 'med9vPFoQGD0OTakPs0jVe3wwmR735hyVwmKIPPsGlaBYj1O6llIpZeQVyupNx56\n' + + 'UzqtiLaDzh1KcmfqP3qP2dInzBfJQKjiRudo1FWnpPt33QIDAQABo4HaMIHXMB0G\n' + + 'A1UdDgQWBBT/H3x+cqSkR/ePSIinPtc4yWKe3DCBpwYDVR0jBIGfMIGcgBT/H3x+\n' + + 'cqSkR/ePSIinPtc4yWKe3KF5pHcwdTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh\n' + + 'c2hpbmd0b24xEDAOBgNVBAcTB1NlYXR0bGUxEzARBgNVBAoTCkFtYXpvbi5jb20x\n' + + 'DDAKBgNVBAsTA1JEUzEcMBoGA1UEAxMTYXdzLmFtYXpvbi5jb20vcmRzL4IJAOd1\n' + + 'tlfiGoEoMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAvguZy/BDT66x\n' + + 'GfgnJlyQwnFSeVLQm9u/FIvz4huGjbq9dqnD6h/Gm56QPFdyMEyDiZWaqY6V08lY\n' + + 'LTBNb4kcIc9/6pc0/ojKciP5QJRm6OiZ4vgG05nF4fYjhU7WClUx7cxq1fKjNc2J\n' + + 'UCmmYqgiVkAGWRETVo+byOSDZ4swb10=\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS global root CA 2015 to 2020 + * + * CN = Amazon RDS Root CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T09:11:31Z/2020-03-05T09:11:31Z + * F = E8:11:88:56:E7:A7:CE:3E:5E:DC:9A:31:25:1B:93:AC:DC:43:CE:B0 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID9DCCAtygAwIBAgIBQjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUwOTExMzFaFw0y\n' + + 'MDAzMDUwOTExMzFaMIGKMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEbMBkGA1UEAwwSQW1hem9uIFJE\n' + + 'UyBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuD8nrZ8V\n' + + 'u+VA8yVlUipCZIKPTDcOILYpUe8Tct0YeQQr0uyl018StdBsa3CjBgvwpDRq1HgF\n' + + 'Ji2N3+39+shCNspQeE6aYU+BHXhKhIIStt3r7gl/4NqYiDDMWKHxHq0nsGDFfArf\n' + + 'AOcjZdJagOMqb3fF46flc8k2E7THTm9Sz4L7RY1WdABMuurpICLFE3oHcGdapOb9\n' + + 'T53pQR+xpHW9atkcf3pf7gbO0rlKVSIoUenBlZipUlp1VZl/OD/E+TtRhDDNdI2J\n' + + 'P/DSMM3aEsq6ZQkfbz/Ilml+Lx3tJYXUDmp+ZjzMPLk/+3beT8EhrwtcG3VPpvwp\n' + + 'BIOqsqVVTvw/CwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\n' + + 'AwEB/zAdBgNVHQ4EFgQUTgLurD72FchM7Sz1BcGPnIQISYMwHwYDVR0jBBgwFoAU\n' + + 'TgLurD72FchM7Sz1BcGPnIQISYMwDQYJKoZIhvcNAQEFBQADggEBAHZcgIio8pAm\n' + + 'MjHD5cl6wKjXxScXKtXygWH2BoDMYBJF9yfyKO2jEFxYKbHePpnXB1R04zJSWAw5\n' + + '2EUuDI1pSBh9BA82/5PkuNlNeSTB3dXDD2PEPdzVWbSKvUB8ZdooV+2vngL0Zm4r\n' + + '47QPyd18yPHrRIbtBtHR/6CwKevLZ394zgExqhnekYKIqqEX41xsUV0Gm6x4vpjf\n' + + '2u6O/+YE2U+qyyxHE5Wd5oqde0oo9UUpFETJPVb6Q2cEeQib8PBAyi0i6KnF+kIV\n' + + 'A9dY7IHSubtCK/i8wxMVqfd5GtbA8mmpeJFwnDvm9rBEsHybl08qlax9syEwsUYr\n' + + '/40NawZfTUU=\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-northeast-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS ap-northeast-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:06Z/2020-03-05T22:03:06Z + * F = 4B:2D:8A:E0:C1:A3:A9:AF:A7:BB:65:0C:5A:16:8A:39:3C:03:F2:C5 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEATCCAumgAwIBAgIBRDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMDZaFw0y\n' + + 'MDAzMDUyMjAzMDZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' + + 'UyBhcC1ub3J0aGVhc3QtMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' + + 'ggEBAMmM2B4PfTXCZjbZMWiDPyxvk/eeNwIRJAhfzesiGUiLozX6CRy3rwC1ZOPV\n' + + 'AcQf0LB+O8wY88C/cV+d4Q2nBDmnk+Vx7o2MyMh343r5rR3Na+4izd89tkQVt0WW\n' + + 'vO21KRH5i8EuBjinboOwAwu6IJ+HyiQiM0VjgjrmEr/YzFPL8MgHD/YUHehqjACn\n' + + 'C0+B7/gu7W4qJzBL2DOf7ub2qszGtwPE+qQzkCRDwE1A4AJmVE++/FLH2Zx78Egg\n' + + 'fV1sUxPtYgjGH76VyyO6GNKM6rAUMD/q5mnPASQVIXgKbupr618bnH+SWHFjBqZq\n' + + 'HvDGPMtiiWII41EmGUypyt5AbysCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' + + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFIiKM0Q6n1K4EmLxs3ZXxINbwEwR\n' + + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' + + 'A4IBAQBezGbE9Rw/k2e25iGjj5n8r+M3dlye8ORfCE/dijHtxqAKasXHgKX8I9Tw\n' + + 'JkBiGWiuzqn7gO5MJ0nMMro1+gq29qjZnYX1pDHPgsRjUX8R+juRhgJ3JSHijRbf\n' + + '4qNJrnwga7pj94MhcLq9u0f6dxH6dXbyMv21T4TZMTmcFduf1KgaiVx1PEyJjC6r\n' + + 'M+Ru+A0eM+jJ7uCjUoZKcpX8xkj4nmSnz9NMPog3wdOSB9cAW7XIc5mHa656wr7I\n' + + 'WJxVcYNHTXIjCcng2zMKd1aCcl2KSFfy56sRfT7J5Wp69QSr+jq8KM55gw8uqAwi\n' + + 'VPrXn2899T1rcTtFYFP16WXjGuc0\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-northeast-2 certificate CA 2015 to 2020 + * + * CN = Amazon RDS ap-northeast-2 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-11-06T00:05:46Z/2020-03-05T00:05:46Z + * F = 77:D9:33:4E:CE:56:FC:42:7B:29:57:8D:67:59:ED:29:4E:18:CB:6B + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEATCCAumgAwIBAgIBTDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTExMDYwMDA1NDZaFw0y\n' + + 'MDAzMDUwMDA1NDZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' + + 'UyBhcC1ub3J0aGVhc3QtMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' + + 'ggEBAKSwd+RVUzTRH0FgnbwoTK8TMm/zMT4+2BvALpAUe6YXbkisg2goycWuuWLg\n' + + 'jOpFBB3GtyvXZnkqi7MkDWUmj1a2kf8l2oLyoaZ+Hm9x/sV+IJzOqPvj1XVUGjP6\n' + + 'yYYnPJmUYqvZeI7fEkIGdFkP2m4/sgsSGsFvpD9FK1bL1Kx2UDpYX0kHTtr18Zm/\n' + + '1oN6irqWALSmXMDydb8hE0FB2A1VFyeKE6PnoDj/Y5cPHwPPdEi6/3gkDkSaOG30\n' + + 'rWeQfL3pOcKqzbHaWTxMphd0DSL/quZ64Nr+Ly65Q5PRcTrtr55ekOUziuqXwk+o\n' + + '9QpACMwcJ7ROqOznZTqTzSFVXFECAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' + + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFM6Nox/QWbhzWVvzoJ/y0kGpNPK+\n' + + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' + + 'A4IBAQCTkWBqNvyRf3Y/W21DwFx3oT/AIWrHt0BdGZO34tavummXemTH9LZ/mqv9\n' + + 'aljt6ZuDtf5DEQjdsAwXMsyo03ffnP7doWm8iaF1+Mui77ot0TmTsP/deyGwukvJ\n' + + 'tkxX8bZjDh+EaNauWKr+CYnniNxCQLfFtXYJsfOdVBzK3xNL+Z3ucOQRhr2helWc\n' + + 'CDQgwfhP1+3pRVKqHvWCPC4R3fT7RZHuRmZ38kndv476GxRntejh+ePffif78bFI\n' + + '3rIZCPBGobrrUMycafSbyXteoGca/kA+/IqrAPlk0pWQ4aEL0yTWN2h2dnjoD7oX\n' + + 'byIuL/g9AGRh97+ssn7D6bDRPTbW\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-southeast-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS ap-southeast-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:19Z/2020-03-05T22:03:19Z + * F = 0E:EC:5D:BD:F9:80:EE:A9:A0:8D:81:AC:37:D9:8D:34:1C:CD:27:D1 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEATCCAumgAwIBAgIBRTANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMTlaFw0y\n' + + 'MDAzMDUyMjAzMTlaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' + + 'UyBhcC1zb3V0aGVhc3QtMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' + + 'ggEBANaXElmSEYt/UtxHFsARFhSUahTf1KNJzR0Dmay6hqOXQuRVbKRwPd19u5vx\n' + + 'DdF1sLT7D69IK3VDnUiQScaCv2Dpu9foZt+rLx+cpx1qiQd1UHrvqq8xPzQOqCdC\n' + + 'RFStq6yVYZ69yfpfoI67AjclMOjl2Vph3ftVnqP0IgVKZdzeC7fd+umGgR9xY0Qr\n' + + 'Ubhd/lWdsbNvzK3f1TPWcfIKQnpvSt85PIEDJir6/nuJUKMtmJRwTymJf0i+JZ4x\n' + + '7dJa341p2kHKcHMgOPW7nJQklGBA70ytjUV6/qebS3yIugr/28mwReflg3TJzVDl\n' + + 'EOvi6pqbqNbkMuEwGDCmEQIVqgkCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' + + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAu93/4k5xbWOsgdCdn+/KdiRuit\n' + + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' + + 'A4IBAQBlcjSyscpPjf5+MgzMuAsCxByqUt+WFspwcMCpwdaBeHOPSQrXNqX2Sk6P\n' + + 'kth6oCivA64trWo8tFMvPYlUA1FYVD5WpN0kCK+P5pD4KHlaDsXhuhClJzp/OP8t\n' + + 'pOyUr5109RHLxqoKB5J5m1XA7rgcFjnMxwBSWFe3/4uMk/+4T53YfCVXuc6QV3i7\n' + + 'I/2LAJwFf//pTtt6fZenYfCsahnr2nvrNRNyAxcfvGZ/4Opn/mJtR6R/AjvQZHiR\n' + + 'bkRNKF2GW0ueK5W4FkZVZVhhX9xh1Aj2Ollb+lbOqADaVj+AT3PoJPZ3MPQHKCXm\n' + + 'xwG0LOLlRr/TfD6li1AfOVTAJXv9\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-southeast-2 certificate CA 2015 to 2020 + * + * CN = Amazon RDS ap-southeast-2 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:24Z/2020-03-05T22:03:24Z + * F = 20:D9:A8:82:23:AB:B9:E5:C5:24:10:D3:4D:0F:3D:B1:31:DF:E5:14 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEATCCAumgAwIBAgIBRjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMjRaFw0y\n' + + 'MDAzMDUyMjAzMjRaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' + + 'UyBhcC1zb3V0aGVhc3QtMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' + + 'ggEBAJqBAJutz69hFOh3BtLHZTbwE8eejGGKayn9hu98YMDPzWzGXWCmW+ZYWELA\n' + + 'cY3cNWNF8K4FqKXFr2ssorBYim1UtYFX8yhydT2hMD5zgQ2sCGUpuidijuPA6zaq\n' + + 'Z3tdhVR94f0q8mpwpv2zqR9PcqaGDx2VR1x773FupRPRo7mEW1vC3IptHCQlP/zE\n' + + '7jQiLl28bDIH2567xg7e7E9WnZToRnhlYdTaDaJsHTzi5mwILi4cihSok7Shv/ME\n' + + 'hnukvxeSPUpaVtFaBhfBqq055ePq9I+Ns4KGreTKMhU0O9fkkaBaBmPaFgmeX/XO\n' + + 'n2AX7gMouo3mtv34iDTZ0h6YCGkCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' + + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFIlQnY0KHYWn1jYumSdJYfwj/Nfw\n' + + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' + + 'A4IBAQA0wVU6/l41cTzHc4azc4CDYY2Wd90DFWiH9C/mw0SgToYfCJ/5Cfi0NT/Y\n' + + 'PRnk3GchychCJgoPA/k9d0//IhYEAIiIDjyFVgjbTkKV3sh4RbdldKVOUB9kumz/\n' + + 'ZpShplsGt3z4QQiVnKfrAgqxWDjR0I0pQKkxXa6Sjkicos9LQxVtJ0XA4ieG1E7z\n' + + 'zJr+6t80wmzxvkInSaWP3xNJK9azVRTrgQZQlvkbpDbExl4mNTG66VD3bAp6t3Wa\n' + + 'B49//uDdfZmPkqqbX+hsxp160OH0rxJppwO3Bh869PkDnaPEd/Pxw7PawC+li0gi\n' + + 'NRV8iCEx85aFxcyOhqn0WZOasxee\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS eu-central-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS eu-central-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:31Z/2020-03-05T22:03:31Z + * F = 94:B4:DF:B9:6D:7E:F7:C3:B7:BF:51:E9:A6:B7:44:A0:D0:82:11:84 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/zCCAuegAwIBAgIBRzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMzFaFw0y\n' + + 'MDAzMDUyMjAzMzFaMIGSMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEjMCEGA1UEAwwaQW1hem9uIFJE\n' + + 'UyBldS1jZW50cmFsLTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\n' + + 'AQDFtP2dhSLuaPOI4ZrrPWsK4OY9ocQBp3yApH1KJYmI9wpQKZG/KCH2E6Oo7JAw\n' + + 'QORU519r033T+FO2Z7pFPlmz1yrxGXyHpJs8ySx3Yo5S8ncDCdZJCLmtPiq/hahg\n' + + '5/0ffexMFUCQaYicFZsrJ/cStdxUV+tSw2JQLD7UxS9J97LQWUPyyG+ZrjYVTVq+\n' + + 'zudnFmNSe4QoecXMhAFTGJFQXxP7nhSL9Ao5FGgdXy7/JWeWdQIAj8ku6cBDKPa6\n' + + 'Y6kP+ak+In+Lye8z9qsCD/afUozfWjPR2aA4JoIZVF8dNRShIMo8l0XfgfM2q0+n\n' + + 'ApZWZ+BjhIO5XuoUgHS3D2YFAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNV\n' + + 'HRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBRm4GsWIA/M6q+tK8WGHWDGh2gcyTAf\n' + + 'BgNVHSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOC\n' + + 'AQEAHpMmeVQNqcxgfQdbDIi5UIy+E7zZykmtAygN1XQrvga9nXTis4kOTN6g5/+g\n' + + 'HCx7jIXeNJzAbvg8XFqBN84Quqgpl/tQkbpco9Jh1HDs558D5NnZQxNqH5qXQ3Mm\n' + + 'uPgCw0pYcPOa7bhs07i+MdVwPBsX27CFDtsgAIru8HvKxY1oTZrWnyIRo93tt/pk\n' + + 'WuItVMVHjaQZVfTCow0aDUbte6Vlw82KjUFq+n2NMSCJDiDKsDDHT6BJc4AJHIq3\n' + + '/4Z52MSC9KMr0yAaaoWfW/yMEj9LliQauAgwVjArF4q78rxpfKTG9Rfd8U1BZANP\n' + + '7FrFMN0ThjfA1IvmOYcgskY5bQ==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS eu-west-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS eu-west-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:35Z/2020-03-05T22:03:35Z + * F = 1A:95:F0:43:82:D2:5D:A6:AD:F5:13:27:0B:40:8A:72:D9:92:F3:E0 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBSDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMzVaFw0y\n' + + 'MDAzMDUyMjAzMzVaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyBldS13ZXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx\n' + + 'PdbqQ0HKRj79Pmocxvjc+P6i4Ux24kgFIl+ckiir1vzkmesc3a58gjrMlCksEObt\n' + + 'Yihs5IhzEq1ePT0gbfS9GYFp34Uj/MtPwlrfCBWG4d2TcrsKRHr1/EXUYhWqmdrb\n' + + 'RhX8XqoRhVkbF/auzFSBhTzcGGvZpQ2KIaxRcQfcXlMVhj/pxxAjh8U4F350Fb0h\n' + + 'nX1jw4/KvEreBL0Xb2lnlGTkwVxaKGSgXEnOgIyOFdOQc61vdome0+eeZsP4jqeR\n' + + 'TGYJA9izJsRbe2YJxHuazD+548hsPlM3vFzKKEVURCha466rAaYAHy3rKur3HYQx\n' + + 'Yt+SoKcEz9PXuSGj96ejAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBTebg//h2oeXbZjQ4uuoiuLYzuiPDAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' + + 'TikPaGeZasTPw+4RBemlsyPAjtFFQLo7ddaFdORLgdEysVf8aBqndvbA6MT/v4lj\n' + + 'GtEtUdF59ZcbWOrVm+fBZ2h/jYJ59dYF/xzb09nyRbdMSzB9+mkSsnOMqluq5y8o\n' + + 'DY/PfP2vGhEg/2ZncRC7nlQU1Dm8F4lFWEiQ2fi7O1cW852Vmbq61RIfcYsH/9Ma\n' + + 'kpgk10VZ75b8m3UhmpZ/2uRY+JEHImH5WpcTJ7wNiPNJsciZMznGtrgOnPzYco8L\n' + + 'cDleOASIZifNMQi9PKOJKvi0ITz0B/imr8KBsW0YjZVJ54HMa7W1lwugSM7aMAs+\n' + + 'E3Sd5lS+SHwWaOCHwhOEVA==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS sa-east-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS sa-east-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:40Z/2020-03-05T22:03:40Z + * F = 32:10:3D:FA:6D:42:F5:35:98:40:15:F4:4C:74:74:27:CB:CE:D4:B5 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBSTANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNDBaFw0y\n' + + 'MDAzMDUyMjAzNDBaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyBzYS1lYXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCU\n' + + 'X4OBnQ5xA6TLJAiFEI6l7bUWjoVJBa/VbMdCCSs2i2dOKmqUaXu2ix2zcPILj3lZ\n' + + 'GMk3d/2zvTK/cKhcFrewHUBamTeVHdEmynhMQamqNmkM4ptYzFcvEUw1TGxHT4pV\n' + + 'Q6gSN7+/AJewQvyHexHo8D0+LDN0/Wa9mRm4ixCYH2CyYYJNKaZt9+EZfNu+PPS4\n' + + '8iB0TWH0DgQkbWMBfCRgolLLitAZklZ4dvdlEBS7evN1/7ttBxUK6SvkeeSx3zBl\n' + + 'ww3BlXqc3bvTQL0A+RRysaVyFbvtp9domFaDKZCpMmDFAN/ntx215xmQdrSt+K3F\n' + + 'cXdGQYHx5q410CAclGnbAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBT6iVWnm/uakS+tEX2mzIfw+8JL0zAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' + + 'FmDD+QuDklXn2EgShwQxV13+txPRuVdOSrutHhoCgMwFWCMtPPtBAKs6KPY7Guvw\n' + + 'DpJoZSehDiOfsgMirjOWjvfkeWSNvKfjWTVneX7pZD9W5WPnsDBvTbCGezm+v87z\n' + + 'b+ZM2ZMo98m/wkMcIEAgdSKilR2fuw8rLkAjhYFfs0A7tDgZ9noKwgHvoE4dsrI0\n' + + 'KZYco6DlP/brASfHTPa2puBLN9McK3v+h0JaSqqm5Ro2Bh56tZkQh8AWy/miuDuK\n' + + '3+hNEVdxosxlkM1TPa1DGj0EzzK0yoeerXuH2HX7LlCrrxf6/wdKnjR12PMrLQ4A\n' + + 'pCqkcWw894z6bV9MAvKe6A==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS us-east-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS us-east-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T21:54:04Z/2020-03-05T21:54:04Z + * F = 34:47:8A:90:8A:83:AE:45:DC:B6:16:76:D2:35:EC:E9:75:C6:2C:63 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBQzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMTU0MDRaFw0y\n' + + 'MDAzMDUyMTU0MDRaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyB1cy1lYXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDI\n' + + 'UIuwh8NusKHk1SqPXcP7OqxY3S/M2ZyQWD3w7Bfihpyyy/fc1w0/suIpX3kbMhAV\n' + + '2ESwged2/2zSx4pVnjp/493r4luhSqQYzru78TuPt9bhJIJ51WXunZW2SWkisSaf\n' + + 'USYUzVN9ezR/bjXTumSUQaLIouJt3OHLX49s+3NAbUyOI8EdvgBQWD68H1epsC0n\n' + + 'CI5s+pIktyOZ59c4DCDLQcXErQ+tNbDC++oct1ANd/q8p9URonYwGCGOBy7sbCYq\n' + + '9eVHh1Iy2M+SNXddVOGw5EuruvHoCIQyOz5Lz4zSuZA9dRbrfztNOpezCNYu6NKM\n' + + 'n+hzcvdiyxv77uNm8EaxAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBQSQG3TmMe6Sa3KufaPBa72v4QFDzAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' + + 'L/mOZfB3187xTmjOHMqN2G2oSKHBKiQLM9uv8+97qT+XR+TVsBT6b3yoPpMAGhHA\n' + + 'Pc7nxAF5gPpuzatx0OTLPcmYucFmfqT/1qA5WlgCnMNtczyNMH97lKFTNV7Njtek\n' + + 'jWEzAEQSyEWrkNpNlC4j6kMYyPzVXQeXUeZTgJ9FNnVZqmvfjip2N22tawMjrCn5\n' + + '7KN/zN65EwY2oO9XsaTwwWmBu3NrDdMbzJnbxoWcFWj4RBwanR1XjQOVNhDwmCOl\n' + + '/1Et13b8CPyj69PC8BOVU6cfTSx8WUVy0qvYOKHNY9Bqa5BDnIL3IVmUkeTlM1mt\n' + + 'enRpyBj+Bk9rh/ICdiRKmA==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS us-west-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS us-west-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:45Z/2020-03-05T22:03:45Z + * F = EF:94:2F:E3:58:0E:09:D6:79:C2:16:97:91:FB:37:EA:D7:70:A8:4B + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBSjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNDVaFw0y\n' + + 'MDAzMDUyMjAzNDVaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyB1cy13ZXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDE\n' + + 'Dhw+uw/ycaiIhhyu2pXFRimq0DlB8cNtIe8hdqndH8TV/TFrljNgR8QdzOgZtZ9C\n' + + 'zzQ2GRpInN/qJF6slEd6wO+6TaDBQkPY+07TXNt52POFUhdVkhJXHpE2BS7Xn6J7\n' + + '7RFAOeG1IZmc2DDt+sR1BgXzUqHslQGfFYNS0/MBO4P+ya6W7IhruB1qfa4HiYQS\n' + + 'dbe4MvGWnv0UzwAqdR7OF8+8/5c58YXZIXCO9riYF2ql6KNSL5cyDPcYK5VK0+Q9\n' + + 'VI6vuJHSMYcF7wLePw8jtBktqAFE/wbdZiIHhZvNyiNWPPNTGUmQbaJ+TzQEHDs5\n' + + '8en+/W7JKnPyBOkxxENbAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBS0nw/tFR9bCjgqWTPJkyy4oOD8bzAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' + + 'CXGAY3feAak6lHdqj6+YWjy6yyUnLK37bRxZDsyDVXrPRQaXRzPTzx79jvDwEb/H\n' + + 'Q/bdQ7zQRWqJcbivQlwhuPJ4kWPUZgSt3JUUuqkMsDzsvj/bwIjlrEFDOdHGh0mi\n' + + 'eVIngFEjUXjMh+5aHPEF9BlQnB8LfVtKj18e15UDTXFa+xJPFxUR7wDzCfo4WI1m\n' + + 'sUMG4q1FkGAZgsoyFPZfF8IVvgCuGdR8z30VWKklFxttlK0eGLlPAyIO0CQxPQlo\n' + + 'saNJrHf4tLOgZIWk+LpDhNd9Et5EzvJ3aURUsKY4pISPPF5WdvM9OE59bERwUErd\n' + + 'nuOuQWQeeadMceZnauRzJQ==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS us-west-2 certificate CA 2015 to 2020 + * + * CN = Amazon RDS us-west-2 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:50Z/2020-03-05T22:03:50Z + * F = 94:2C:A8:B0:23:48:17:F0:CD:2F:19:7F:C1:E0:21:7C:65:79:13:3A + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBSzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNTBaFw0y\n' + + 'MDAzMDUyMjAzNTBaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyB1cy13ZXN0LTIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDM\n' + + 'H58SR48U6jyERC1vYTnub34smf5EQVXyzaTmspWGWGzT31NLNZGSDFaa7yef9kdO\n' + + 'mzJsgebR5tXq6LdwlIoWkKYQ7ycUaadtVKVYdI40QcI3cHn0qLFlg2iBXmWp/B+i\n' + + 'Z34VuVlCh31Uj5WmhaBoz8t/GRqh1V/aCsf3Wc6jCezH3QfuCjBpzxdOOHN6Ie2v\n' + + 'xX09O5qmZTvMoRBAvPkxdaPg/Mi7fxueWTbEVk78kuFbF1jHYw8U1BLILIAhcqlq\n' + + 'x4u8nl73t3O3l/soNUcIwUDK0/S+Kfqhwn9yQyPlhb4Wy3pfnZLJdkyHldktnQav\n' + + '9TB9u7KH5Lk0aAYslMLxAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBT8roM4lRnlFHWMPWRz0zkwFZog1jAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' + + 'JwrxwgwmPtcdaU7O7WDdYa4hprpOMamI49NDzmE0s10oGrqmLwZygcWU0jT+fJ+Y\n' + + 'pJe1w0CVfKaeLYNsOBVW3X4ZPmffYfWBheZiaiEflq/P6t7/Eg81gaKYnZ/x1Dfa\n' + + 'sUYkzPvCkXe9wEz5zdUTOCptDt89rBR9CstL9vE7WYUgiVVmBJffWbHQLtfjv6OF\n' + + 'NMb0QME981kGRzc2WhgP71YS2hHd1kXtsoYP1yTu4vThSKsoN4bkiHsaC1cRkLoy\n' + + '0fFA4wpB3WloMEvCDaUvvH1LZlBXTNlwi9KtcwD4tDxkkBt4tQczKLGpQ/nF/W9n\n' + + '8YDWk3IIc1sd0bkZqoau2Q==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-south-1 certificate CA 2016 to 2020 + * + * CN = Amazon RDS ap-south-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2016-05-03T21:29:22Z/2020-03-05T21:29:22Z + * F = F3:A3:C2:52:D9:82:20:AC:8C:62:31:2A:8C:AD:5D:7B:1C:31:F1:DD + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/TCCAuWgAwIBAgIBTTANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjA1MDMyMTI5MjJaFw0y\n' + + 'MDAzMDUyMTI5MjJaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEhMB8GA1UEAwwYQW1hem9uIFJE\n' + + 'UyBhcC1zb3V0aC0xIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n' + + '06eWGLE0TeqL9kyWOLkS8q0fXO97z+xyBV3DKSB2lg2GkgBz3B98MkmkeB0SZy3G\n' + + 'Ce4uCpCPbFKiFEdiUclOlhZsrBuCeaimxLM3Ig2wuenElO/7TqgaYHYUbT3d+VQW\n' + + 'GUbLn5GRZJZe1OAClYdOWm7A1CKpuo+cVV1vxbY2nGUQSJPpVn2sT9gnwvjdE60U\n' + + 'JGYU/RLCTm8zmZBvlWaNIeKDnreIc4rKn6gUnJ2cQn1ryCVleEeyc3xjYDSrjgdn\n' + + 'FLYGcp9mphqVT0byeQMOk0c7RHpxrCSA0V5V6/CreFV2LteK50qcDQzDSM18vWP/\n' + + 'p09FoN8O7QrtOeZJzH/lmwIDAQABo2YwZDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0T\n' + + 'AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU2i83QHuEl/d0keXF+69HNJph7cMwHwYD\n' + + 'VR0jBBgwFoAUTgLurD72FchM7Sz1BcGPnIQISYMwDQYJKoZIhvcNAQELBQADggEB\n' + + 'ACqnH2VjApoDqoSQOky52QBwsGaj+xWYHW5Gm7EvCqvQuhWMkeBuD6YJmMvNyA9G\n' + + 'I2lh6/o+sUk/RIsbYbxPRdhNPTOgDR9zsNRw6qxaHztq/CEC+mxDCLa3O1hHBaDV\n' + + 'BmB3nCZb93BvO0EQSEk7aytKq/f+sjyxqOcs385gintdHGU9uM7gTZHnU9vByJsm\n' + + '/TL07Miq67X0NlhIoo3jAk+xHaeKJdxdKATQp0448P5cY20q4b8aMk1twcNaMvCP\n' + + 'dG4M5doaoUA8OQ/0ukLLae/LBxLeTw04q1/a2SyFaVUX2Twbb1S3xVWwLA8vsyGr\n' + + 'igXx7B5GgP+IHb6DTjPJAi0=\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS us-east-2 certificate CA 2016 to 2020 + * + * CN = Amazon RDS us-east-2 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2016-08-11T19:58:45Z/2020-03-05T19:58:45Z + * F = 9B:78:E3:64:7F:74:BC:B2:52:18:CF:13:C3:62:B8:35:9D:3D:5F:B6 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBTjANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjA4MTExOTU4NDVaFw0y\n' + + 'MDAzMDUxOTU4NDVaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyB1cy1lYXN0LTIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCp\n' + + 'WnnUX7wM0zzstccX+4iXKJa9GR0a2PpvB1paEX4QRCgfhEdQWDaSqyrWNgdVCKkt\n' + + '1aQkWu5j6VAC2XIG7kKoonm1ZdBVyBLqW5lXNywlaiU9yhJkwo8BR+/OqgE+PLt/\n' + + 'EO1mlN0PQudja/XkExCXTO29TG2j7F/O7hox6vTyHNHc0H88zS21uPuBE+jivViS\n' + + 'yzj/BkyoQ85hnkues3f9R6gCGdc+J51JbZnmgzUkvXjAEuKhAm9JksVOxcOKUYe5\n' + + 'ERhn0U9zjzpfbAITIkul97VVa5IxskFFTHIPJbvRKHJkiF6wTJww/tc9wm+fSCJ1\n' + + '+DbQTGZgkQ3bJrqRN29/AgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBSAHQzUYYZbepwKEMvGdHp8wzHnfDAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOCAQEA\n' + + 'MbaEzSYZ+aZeTBxf8yi0ta8K4RdwEJsEmP6IhFFQHYUtva2Cynl4Q9tZg3RMsybT\n' + + '9mlnSQQlbN/wqIIXbkrcgFcHoXG9Odm/bDtUwwwDaiEhXVfeQom3G77QHOWMTCGK\n' + + 'qadwuh5msrb17JdXZoXr4PYHDKP7j0ONfAyFNER2+uecblHfRSpVq5UeF3L6ZJb8\n' + + 'fSw/GtAV6an+/0r+Qm+PiI2H5XuZ4GmRJYnGMhqWhBYrY7p3jtVnKcsh39wgfUnW\n' + + 'AvZEZG/yhFyAZW0Essa39LiL5VSq14Y1DOj0wgnhSY/9WHxaAo1HB1T9OeZknYbD\n' + + 'fl/EGSZ0TEvZkENrXcPlVA==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ca-central-1 certificate CA 2016 to 2020 + * + * CN = Amazon RDS ca-central-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2016-09-15T00:10:11Z/2020-03-05T00:10:11Z + * F = D7:E0:16:AB:8A:0B:63:9F:67:1F:16:87:42:F4:0A:EE:73:A6:FC:04 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/zCCAuegAwIBAgIBTzANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjA5MTUwMDEwMTFaFw0y\n' + + 'MDAzMDUwMDEwMTFaMIGSMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEjMCEGA1UEAwwaQW1hem9uIFJE\n' + + 'UyBjYS1jZW50cmFsLTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\n' + + 'AQCZYI/iQ6DrS3ny3t1EwX1wAD+3LMgh7Fd01EW5LIuaK2kYIIQpsVKhxLCit/V5\n' + + 'AGc/1qiJS1Qz9ODLTh0Na6bZW6EakRzuHJLe32KJtoFYPC7Z09UqzXrpA/XL+1hM\n' + + 'P0ZmCWsU7Nn/EmvfBp9zX3dZp6P6ATrvDuYaVFr+SA7aT3FXpBroqBS1fyzUPs+W\n' + + 'c6zTR6+yc4zkHX0XQxC5RH6xjgpeRkoOajA/sNo7AQF7KlWmKHbdVF44cvvAhRKZ\n' + + 'XaoVs/C4GjkaAEPTCbopYdhzg+KLx9eB2BQnYLRrIOQZtRfbQI2Nbj7p3VsRuOW1\n' + + 'tlcks2w1Gb0YC6w6SuIMFkl1AgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNV\n' + + 'HRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBToYWxE1lawl6Ks6NsvpbHQ3GKEtzAf\n' + + 'BgNVHSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOC\n' + + 'AQEAG/8tQ0ooi3hoQpa5EJz0/E5VYBsAz3YxA2HoIonn0jJyG16bzB4yZt4vNQMA\n' + + 'KsNlQ1uwDWYL1nz63axieUUFIxqxl1KmwfhsmLgZ0Hd2mnTPIl2Hw3uj5+wdgGBg\n' + + 'agnAZ0bajsBYgD2VGQbqjdk2Qn7Fjy3LEWIvGZx4KyZ99OJ2QxB7JOPdauURAtWA\n' + + 'DKYkP4LLJxtj07DSzG8kuRWb9B47uqUD+eKDIyjfjbnzGtd9HqqzYFau7EX3HVD9\n' + + '9Qhnjl7bTZ6YfAEZ3nH2t3Vc0z76XfGh47rd0pNRhMV+xpok75asKf/lNh5mcUrr\n' + + 'VKwflyMkQpSbDCmcdJ90N2xEXQ==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS eu-west-2 certificate CA 2016 to 2020 + * + * CN = Amazon RDS eu-west-2 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2016-10-10T17:44:42Z/2020-03-05T17:44:42Z + * F = 47:79:51:9F:FF:07:D3:F4:27:D3:AB:64:56:7F:00:45:BB:84:C1:71 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBUDANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjEwMTAxNzQ0NDJaFw0y\n' + + 'MDAzMDUxNzQ0NDJaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyBldS13ZXN0LTIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDO\n' + + 'cttLJfubB4XMMIGWNfJISkIdCMGJyOzLiMJaiWB5GYoXKhEl7YGotpy0qklwW3BQ\n' + + 'a0fmVdcCLX+dIuVQ9iFK+ZcK7zwm7HtdDTCHOCKeOh2IcnU4c/VIokFi6Gn8udM6\n' + + 'N/Zi5M5OGpVwLVALQU7Yctsn3c95el6MdVx6mJiIPVu7tCVZn88Z2koBQ2gq9P4O\n' + + 'Sb249SHFqOb03lYDsaqy1NDsznEOhaRBw7DPJFpvmw1lA3/Y6qrExRI06H2VYR2i\n' + + '7qxwDV50N58fs10n7Ye1IOxTVJsgEA7X6EkRRXqYaM39Z76R894548WHfwXWjUsi\n' + + 'MEX0RS0/t1GmnUQjvevDAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBQBxmcuRSxERYCtNnSr5xNfySokHjAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOCAQEA\n' + + 'UyCUQjsF3nUAABjfEZmpksTuUo07aT3KGYt+EMMFdejnBQ0+2lJJFGtT+CDAk1SD\n' + + 'RSgfEBon5vvKEtlnTf9a3pv8WXOAkhfxnryr9FH6NiB8obISHNQNPHn0ljT2/T+I\n' + + 'Y6ytfRvKHa0cu3V0NXbJm2B4KEOt4QCDiFxUIX9z6eB4Kditwu05OgQh6KcogOiP\n' + + 'JesWxBMXXGoDC1rIYTFO7szwDyOHlCcVXJDNsTJhc32oDWYdeIbW7o/5I+aQsrXZ\n' + + 'C96HykZcgWzz6sElrQxUaT3IoMw/5nmw4uWKKnZnxgI9bY4fpQwMeBZ96iHfFxvH\n' + + 'mqfEEuC7uUoPofXdBp2ObQ==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS us-gov-west-1 CA 2017 to 2022 + * + * CN = Amazon RDS us-gov-west-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2017-05-19T22:31:19Z/2022-05-18T12:00:00Z + * F = 77:55:8C:C4:5E:71:1F:1B:57:E3:DA:6E:5B:74:27:12:4E:E8:69:E8 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIECjCCAvKgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZMxCzAJBgNVBAYTAlVT\n' + + 'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' + + 'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' + + 'MSQwIgYDVQQDDBtBbWF6b24gUkRTIEdvdkNsb3VkIFJvb3QgQ0EwHhcNMTcwNTE5\n' + + 'MjIzMTE5WhcNMjIwNTE4MTIwMDAwWjCBkzELMAkGA1UEBhMCVVMxEzARBgNVBAgM\n' + + 'Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoMGUFtYXpvbiBX\n' + + 'ZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxJDAiBgNVBAMM\n' + + 'G0FtYXpvbiBSRFMgdXMtZ292LXdlc3QtMSBDQTCCASIwDQYJKoZIhvcNAQEBBQAD\n' + + 'ggEPADCCAQoCggEBAM8YZLKAzzOdNnoi7Klih26Zkj+OCpDfwx4ZYB6f8L8UoQi5\n' + + '8z9ZtIwMjiJ/kO08P1yl4gfc7YZcNFvhGruQZNat3YNpxwUpQcr4mszjuffbL4uz\n' + + '+/8FBxALdqCVOJ5Q0EVSfz3d9Bd1pUPL7ARtSpy7bn/tUPyQeI+lODYO906C0TQ3\n' + + 'b9bjOsgAdBKkHfjLdsknsOZYYIzYWOJyFJJa0B11XjDUNBy/3IuC0KvDl6At0V5b\n' + + '8M6cWcKhte2hgjwTYepV+/GTadeube1z5z6mWsN5arOAQUtYDLH6Aztq9mCJzLHm\n' + + 'RccBugnGl3fRLJ2VjioN8PoGoN9l9hFBy5fnFgsCAwEAAaNmMGQwDgYDVR0PAQH/\n' + + 'BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFEG7+br8KkvwPd5g\n' + + '71Rvh2stclJbMB8GA1UdIwQYMBaAFEkQz6S4NS5lOYKcDjBSuCcVpdzjMA0GCSqG\n' + + 'SIb3DQEBCwUAA4IBAQBMA327u5ABmhX+aPxljoIbxnydmAFWxW6wNp5+rZrvPig8\n' + + 'zDRqGQWWr7wWOIjfcWugSElYtf/m9KZHG/Z6+NG7nAoUrdcd1h/IQhb+lFQ2b5g9\n' + + 'sVzQv/H2JNkfZA8fL/Ko/Tm/f9tcqe0zrGCtT+5u0Nvz35Wl8CEUKLloS5xEb3k5\n' + + '7D9IhG3fsE3vHWlWrGCk1cKry3j12wdPG5cUsug0vt34u6rdhP+FsM0tHI15Kjch\n' + + 'RuUCvyQecy2ZFNAa3jmd5ycNdL63RWe8oayRBpQBxPPCbHfILxGZEdJbCH9aJ2D/\n' + + 'l8oHIDnvOLdv7/cBjyYuvmprgPtu3QEkbre5Hln/\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS eu-west-3 certificate CA 2017 to 2020 + * + * CN = Amazon RDS eu-west-3 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2017-08-25T21:39:26Z/2020-03-05T21:39:26Z + * F = FD:35:A7:84:60:68:98:00:12:54:ED:34:26:8C:66:0F:72:DD:B2:F4 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBUTANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNzA4MjUyMTM5MjZaFw0y\n' + + 'MDAzMDUyMTM5MjZaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyBldS13ZXN0LTMgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+\n' + + 'xmlEC/3a4cJH+UPwXCE02lC7Zq5NHd0dn6peMeLN8agb6jW4VfSY0NydjRj2DJZ8\n' + + 'K7wV6sub5NUGT1NuFmvSmdbNR2T59KX0p2dVvxmXHHtIpQ9Y8Aq3ZfhmC5q5Bqgw\n' + + 'tMA1xayDi7HmoPX3R8kk9ktAZQf6lDeksCvok8idjTu9tiSpDiMwds5BjMsWfyjZ\n' + + 'd13PTGGNHYVdP692BSyXzSP1Vj84nJKnciW8tAqwIiadreJt5oXyrCXi8ekUMs80\n' + + 'cUTuGm3aA3Q7PB5ljJMPqz0eVddaiIvmTJ9O3Ez3Du/HpImyMzXjkFaf+oNXf/Hx\n' + + '/EW5jCRR6vEiXJcDRDS7AgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRZ9mRtS5fHk3ZKhG20Oack4cAqMTAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOCAQEA\n' + + 'F/u/9L6ExQwD73F/bhCw7PWcwwqsK1mypIdrjdIsu0JSgwWwGCXmrIspA3n3Dqxq\n' + + 'sMhAJD88s9Em7337t+naar2VyLO63MGwjj+vA4mtvQRKq8ScIpiEc7xN6g8HUMsd\n' + + 'gPG9lBGfNjuAZsrGJflrko4HyuSM7zHExMjXLH+CXcv/m3lWOZwnIvlVMa4x0Tz0\n' + + 'A4fklaawryngzeEjuW6zOiYCzjZtPlP8Fw0SpzppJ8VpQfrZ751RDo4yudmPqoPK\n' + + '5EUe36L8U+oYBXnC5TlYs9bpVv9o5wJQI5qA9oQE2eFWxF1E0AyZ4V5sgGUBStaX\n' + + 'BjDDWul0wSo7rt1Tq7XpnA==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-northeast-3 certificate CA 2017 to 2020 + * + * CN = Amazon RDS ap-northeast-3 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2017-12-01T00:55:42Z/2020-03-05T00:55:42Z + * F = C0:C7:D4:B3:91:40:A0:77:43:28:BF:AF:77:57:DF:FD:98:FB:10:3F + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEATCCAumgAwIBAgIBTjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNzEyMDEwMDU1NDJaFw0y\n' + + 'MDAzMDUwMDU1NDJaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' + + 'UyBhcC1ub3J0aGVhc3QtMyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' + + 'ggEBAMZtQNnm/XT19mTa10ftHLzg5UhajoI65JHv4TQNdGXdsv+CQdGYU49BJ9Eu\n' + + '3bYgiEtTzR2lQe9zGMvtuJobLhOWuavzp7IixoIQcHkFHN6wJ1CvqrxgvJfBq6Hy\n' + + 'EuCDCiU+PPDLUNA6XM6Qx3IpHd1wrJkjRB80dhmMSpxmRmx849uFafhN+P1QybsM\n' + + 'TI0o48VON2+vj+mNuQTyLMMP8D4odSQHjaoG+zyJfJGZeAyqQyoOUOFEyQaHC3TT\n' + + '3IDSNCQlpxb9LerbCoKu79WFBBq3CS5cYpg8/fsnV2CniRBFFUumBt5z4dhw9RJU\n' + + 'qlUXXO1ZyzpGd+c5v6FtrfXtnIUCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' + + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFETv7ELNplYy/xTeIOInl6nzeiHg\n' + + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' + + 'A4IBAQCpKxOQcd0tEKb3OtsOY8q/MPwTyustGk2Rt7t9G68idADp8IytB7M0SDRo\n' + + 'wWZqynEq7orQVKdVOanhEWksNDzGp0+FPAf/KpVvdYCd7ru3+iI+V4ZEp2JFdjuZ\n' + + 'Zz0PIjS6AgsZqE5Ri1J+NmfmjGZCPhsHnGZiBaenX6K5VRwwwmLN6xtoqrrfR5zL\n' + + 'QfBeeZNJG6KiM3R/DxJ5rAa6Fz+acrhJ60L7HprhB7SFtj1RCijau3+ZwiGmUOMr\n' + + 'yKlMv+VgmzSw7o4Hbxy1WVrA6zQsTHHSGf+vkQn2PHvnFMUEu/ZLbTDYFNmTLK91\n' + + 'K6o4nMsEvhBKgo4z7H1EqqxXhvN2\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS GovCloud Root CA 2017 to 2022 + * + * CN = Amazon RDS GovCloud Root CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2017-05-19T22:29:11Z/2022-05-18T22:29:11Z + * F = A3:61:F9:C9:A2:5B:91:FE:73:A6:52:E3:59:14:8E:CE:35:12:0F:FD + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEDjCCAvagAwIBAgIJAMM61RQn3/kdMA0GCSqGSIb3DQEBCwUAMIGTMQswCQYD\n' + + 'VQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\n' + + 'MCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\n' + + 'em9uIFJEUzEkMCIGA1UEAwwbQW1hem9uIFJEUyBHb3ZDbG91ZCBSb290IENBMB4X\n' + + 'DTE3MDUxOTIyMjkxMVoXDTIyMDUxODIyMjkxMVowgZMxCzAJBgNVBAYTAlVTMRAw\n' + + 'DgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQKDBlB\n' + + 'bWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMSQw\n' + + 'IgYDVQQDDBtBbWF6b24gUkRTIEdvdkNsb3VkIFJvb3QgQ0EwggEiMA0GCSqGSIb3\n' + + 'DQEBAQUAA4IBDwAwggEKAoIBAQDGS9bh1FGiJPT+GRb3C5aKypJVDC1H2gbh6n3u\n' + + 'j8cUiyMXfmm+ak402zdLpSYMaxiQ7oL/B3wEmumIpRDAsQrSp3B/qEeY7ipQGOfh\n' + + 'q2TXjXGIUjiJ/FaoGqkymHRLG+XkNNBtb7MRItsjlMVNELXECwSiMa3nJL2/YyHW\n' + + 'nTr1+11/weeZEKgVbCUrOugFkMXnfZIBSn40j6EnRlO2u/NFU5ksK5ak2+j8raZ7\n' + + 'xW7VXp9S1Tgf1IsWHjGZZZguwCkkh1tHOlHC9gVA3p63WecjrIzcrR/V27atul4m\n' + + 'tn56s5NwFvYPUIx1dbC8IajLUrepVm6XOwdQCfd02DmOyjWJAgMBAAGjYzBhMA4G\n' + + 'A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRJEM+kuDUu\n' + + 'ZTmCnA4wUrgnFaXc4zAfBgNVHSMEGDAWgBRJEM+kuDUuZTmCnA4wUrgnFaXc4zAN\n' + + 'BgkqhkiG9w0BAQsFAAOCAQEAcfA7uirXsNZyI2j4AJFVtOTKOZlQwqbyNducnmlg\n' + + '/5nug9fAkwM4AgvF5bBOD1Hw6khdsccMwIj+1S7wpL+EYb/nSc8G0qe1p/9lZ/mZ\n' + + 'ff5g4JOa26lLuCrZDqAk4TzYnt6sQKfa5ZXVUUn0BK3okhiXS0i+NloMyaBCL7vk\n' + + 'kDwkHwEqflRKfZ9/oFTcCfoiHPA7AdBtaPVr0/Kj9L7k+ouz122huqG5KqX0Zpo8\n' + + 'S0IGvcd2FZjNSNPttNAK7YuBVsZ0m2nIH1SLp//00v7yAHIgytQwwB17PBcp4NXD\n' + + 'pCfTa27ng9mMMC2YLqWQpW4TkqjDin2ZC+5X/mbrjzTvVg==\n' + + '-----END CERTIFICATE-----\n' + ] +}; + + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +var Parser = __webpack_require__(36); +var Sequences = __webpack_require__(41); +var Packets = __webpack_require__(2); +var Stream = __webpack_require__(13).Stream; +var Util = __webpack_require__(0); +var PacketWriter = __webpack_require__(80); + +module.exports = Protocol; +Util.inherits(Protocol, Stream); +function Protocol(options) { + Stream.call(this); + + options = options || {}; + + this.readable = true; + this.writable = true; + + this._config = options.config || {}; + this._connection = options.connection; + this._callback = null; + this._fatalError = null; + this._quitSequence = null; + this._handshake = false; + this._handshaked = false; + this._ended = false; + this._destroyed = false; + this._queue = []; + this._handshakeInitializationPacket = null; + + this._parser = new Parser({ + onError : this.handleParserError.bind(this), + onPacket : this._parsePacket.bind(this), + config : this._config + }); +} + +Protocol.prototype.write = function(buffer) { + this._parser.write(buffer); + return true; +}; + +Protocol.prototype.handshake = function handshake(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + options.config = this._config; + + var sequence = this._enqueue(new Sequences.Handshake(options, callback)); + + this._handshake = true; + + return sequence; +}; + +Protocol.prototype.query = function query(options, callback) { + return this._enqueue(new Sequences.Query(options, callback)); +}; + +Protocol.prototype.changeUser = function changeUser(options, callback) { + return this._enqueue(new Sequences.ChangeUser(options, callback)); +}; + +Protocol.prototype.ping = function ping(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + return this._enqueue(new Sequences.Ping(options, callback)); +}; + +Protocol.prototype.stats = function stats(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + return this._enqueue(new Sequences.Statistics(options, callback)); +}; + +Protocol.prototype.quit = function quit(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + var self = this; + var sequence = this._enqueue(new Sequences.Quit(options, callback)); + + sequence.on('end', function () { + self.end(); + }); + + return this._quitSequence = sequence; +}; + +Protocol.prototype.end = function() { + if (this._ended) { + return; + } + this._ended = true; + + if (this._quitSequence && (this._quitSequence._ended || this._queue[0] === this._quitSequence)) { + this._quitSequence.end(); + this.emit('end'); + return; + } + + var err = new Error('Connection lost: The server closed the connection.'); + err.fatal = true; + err.code = 'PROTOCOL_CONNECTION_LOST'; + + this._delegateError(err); +}; + +Protocol.prototype.pause = function() { + this._parser.pause(); + // Since there is a file stream in query, we must transmit pause/resume event to current sequence. + var seq = this._queue[0]; + if (seq && seq.emit) { + seq.emit('pause'); + } +}; + +Protocol.prototype.resume = function() { + this._parser.resume(); + // Since there is a file stream in query, we must transmit pause/resume event to current sequence. + var seq = this._queue[0]; + if (seq && seq.emit) { + seq.emit('resume'); + } +}; + +Protocol.prototype._enqueue = function(sequence) { + if (!this._validateEnqueue(sequence)) { + return sequence; + } + + if (this._config.trace) { + // Long stack trace support + sequence._callSite = sequence._callSite || new Error(); + } + + this._queue.push(sequence); + this.emit('enqueue', sequence); + + var self = this; + sequence + .on('error', function(err) { + self._delegateError(err, sequence); + }) + .on('packet', function(packet) { + sequence._timer.active(); + self._emitPacket(packet); + }) + .on('end', function() { + self._dequeue(sequence); + }) + .on('timeout', function() { + var err = new Error(sequence.constructor.name + ' inactivity timeout'); + + err.code = 'PROTOCOL_SEQUENCE_TIMEOUT'; + err.fatal = true; + err.timeout = sequence._timeout; + + self._delegateError(err, sequence); + }) + .on('start-tls', function() { + sequence._timer.active(); + self._connection._startTLS(function(err) { + if (err) { + // SSL negotiation error are fatal + err.code = 'HANDSHAKE_SSL_ERROR'; + err.fatal = true; + sequence.end(err); + return; + } + + sequence._timer.active(); + sequence._tlsUpgradeCompleteHandler(); + }); + }); + + if (this._queue.length === 1) { + this._parser.resetPacketNumber(); + this._startSequence(sequence); + } + + return sequence; +}; + +Protocol.prototype._validateEnqueue = function _validateEnqueue(sequence) { + var err; + var prefix = 'Cannot enqueue ' + sequence.constructor.name; + + if (this._fatalError) { + err = new Error(prefix + ' after fatal error.'); + err.code = 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR'; + } else if (this._quitSequence) { + err = new Error(prefix + ' after invoking quit.'); + err.code = 'PROTOCOL_ENQUEUE_AFTER_QUIT'; + } else if (this._destroyed) { + err = new Error(prefix + ' after being destroyed.'); + err.code = 'PROTOCOL_ENQUEUE_AFTER_DESTROY'; + } else if ((this._handshake || this._handshaked) && sequence.constructor === Sequences.Handshake) { + err = new Error(prefix + ' after already enqueuing a Handshake.'); + err.code = 'PROTOCOL_ENQUEUE_HANDSHAKE_TWICE'; + } else { + return true; + } + + var self = this; + err.fatal = false; + + // add error handler + sequence.on('error', function (err) { + self._delegateError(err, sequence); + }); + + process.nextTick(function () { + sequence.end(err); + }); + + return false; +}; + +Protocol.prototype._parsePacket = function() { + var sequence = this._queue[0]; + + if (!sequence) { + var err = new Error('Received packet with no active sequence.'); + err.code = 'PROTOCOL_STRAY_PACKET'; + err.fatal = true; + + this._delegateError(err); + return; + } + + var Packet = this._determinePacket(sequence); + var packet = new Packet({protocol41: this._config.protocol41}); + var packetName = Packet.name; + + // Special case: Faster dispatch, and parsing done inside sequence + if (Packet === Packets.RowDataPacket) { + sequence.RowDataPacket(packet, this._parser, this._connection); + + if (this._config.debug) { + this._debugPacket(true, packet); + } + + return; + } + + if (this._config.debug) { + this._parsePacketDebug(packet); + } else { + packet.parse(this._parser); + } + + if (Packet === Packets.HandshakeInitializationPacket) { + this._handshakeInitializationPacket = packet; + } + + sequence._timer.active(); + + if (!sequence[packetName]) { + var err = new Error('Received packet in the wrong sequence.'); + err.code = 'PROTOCOL_INCORRECT_PACKET_SEQUENCE'; + err.fatal = true; + + this._delegateError(err); + return; + } + + sequence[packetName](packet); +}; + +Protocol.prototype._parsePacketDebug = function _parsePacketDebug(packet) { + try { + packet.parse(this._parser); + } finally { + this._debugPacket(true, packet); + } +}; + +Protocol.prototype._emitPacket = function(packet) { + var packetWriter = new PacketWriter(); + packet.write(packetWriter); + this.emit('data', packetWriter.toBuffer(this._parser)); + + if (this._config.debug) { + this._debugPacket(false, packet); + } +}; + +Protocol.prototype._determinePacket = function(sequence) { + var firstByte = this._parser.peak(); + + if (sequence.determinePacket) { + var Packet = sequence.determinePacket(firstByte, this._parser); + if (Packet) { + return Packet; + } + } + + switch (firstByte) { + case 0x00: + if (!this._handshaked) { + this._handshaked = true; + this.emit('handshake', this._handshakeInitializationPacket); + } + return Packets.OkPacket; + case 0xfe: return Packets.EofPacket; + case 0xff: return Packets.ErrorPacket; + } + + throw new Error('Could not determine packet, firstByte = ' + firstByte); +}; + +Protocol.prototype._dequeue = function(sequence) { + sequence._timer.stop(); + + // No point in advancing the queue, we are dead + if (this._fatalError) { + return; + } + + this._queue.shift(); + + var sequence = this._queue[0]; + if (!sequence) { + this.emit('drain'); + return; + } + + this._parser.resetPacketNumber(); + + this._startSequence(sequence); +}; + +Protocol.prototype._startSequence = function(sequence) { + if (sequence._timeout > 0 && isFinite(sequence._timeout)) { + sequence._timer.start(sequence._timeout); + } + + if (sequence.constructor === Sequences.ChangeUser) { + sequence.start(this._handshakeInitializationPacket); + } else { + sequence.start(); + } +}; + +Protocol.prototype.handleNetworkError = function(err) { + err.fatal = true; + + var sequence = this._queue[0]; + if (sequence) { + sequence.end(err); + } else { + this._delegateError(err); + } +}; + +Protocol.prototype.handleParserError = function handleParserError(err) { + var sequence = this._queue[0]; + if (sequence) { + sequence.end(err); + } else { + this._delegateError(err); + } +}; + +Protocol.prototype._delegateError = function(err, sequence) { + // Stop delegating errors after the first fatal error + if (this._fatalError) { + return; + } + + if (err.fatal) { + this._fatalError = err; + } + + if (this._shouldErrorBubbleUp(err, sequence)) { + // Can't use regular 'error' event here as that always destroys the pipe + // between socket and protocol which is not what we want (unless the + // exception was fatal). + this.emit('unhandledError', err); + } else if (err.fatal) { + // Send fatal error to all sequences in the queue + var queue = this._queue; + process.nextTick(function () { + queue.forEach(function (sequence) { + sequence.end(err); + }); + queue.length = 0; + }); + } + + // Make sure the stream we are piping to is getting closed + if (err.fatal) { + this.emit('end', err); + } +}; + +Protocol.prototype._shouldErrorBubbleUp = function(err, sequence) { + if (sequence) { + if (sequence.hasErrorHandler()) { + return false; + } else if (!err.fatal) { + return true; + } + } + + return (err.fatal && !this._hasPendingErrorHandlers()); +}; + +Protocol.prototype._hasPendingErrorHandlers = function() { + return this._queue.some(function(sequence) { + return sequence.hasErrorHandler(); + }); +}; + +Protocol.prototype.destroy = function() { + this._destroyed = true; + this._parser.pause(); + + if (this._connection.state !== 'disconnected') { + if (!this._ended) { + this.end(); + } + } +}; + +Protocol.prototype._debugPacket = function(incoming, packet) { + var connection = this._connection; + var headline = incoming + ? '<-- ' + : '--> '; + + if (connection && connection.threadId !== null) { + headline += '(' + connection.threadId + ') '; + } + + headline += packet.constructor.name; + + // check for debug packet restriction + if (Array.isArray(this._config.debug) && this._config.debug.indexOf(packet.constructor.name) === -1) { + return; + } + + console.log(headline); + console.log(packet); + console.log(''); +}; + + +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + +var MAX_PACKET_LENGTH = Math.pow(2, 24) - 1; +var MUL_32BIT = Math.pow(2, 32); +var PacketHeader = __webpack_require__(37); +var BigNumber = __webpack_require__(38); +var Buffer = __webpack_require__(1).Buffer; +var BufferList = __webpack_require__(40); + +module.exports = Parser; +function Parser(options) { + options = options || {}; + + this._supportBigNumbers = options.config && options.config.supportBigNumbers; + this._buffer = Buffer.alloc(0); + this._nextBuffers = new BufferList(); + this._longPacketBuffers = new BufferList(); + this._offset = 0; + this._packetEnd = null; + this._packetHeader = null; + this._packetOffset = null; + this._onError = options.onError || function(err) { throw err; }; + this._onPacket = options.onPacket || function() {}; + this._nextPacketNumber = 0; + this._encoding = 'utf-8'; + this._paused = false; +} + +Parser.prototype.write = function write(chunk) { + this._nextBuffers.push(chunk); + + while (!this._paused) { + if (!this._packetHeader) { + if (!this._combineNextBuffers(4)) { + break; + } + + this._packetHeader = new PacketHeader( + this.parseUnsignedNumber(3), + this.parseUnsignedNumber(1) + ); + + if (this._packetHeader.number !== this._nextPacketNumber) { + var err = new Error( + 'Packets out of order. Got: ' + this._packetHeader.number + ' ' + + 'Expected: ' + this._nextPacketNumber + ); + + err.code = 'PROTOCOL_PACKETS_OUT_OF_ORDER'; + err.fatal = true; + + this._onError(err); + } + + this.incrementPacketNumber(); + } + + if (!this._combineNextBuffers(this._packetHeader.length)) { + break; + } + + this._packetEnd = this._offset + this._packetHeader.length; + this._packetOffset = this._offset; + + if (this._packetHeader.length === MAX_PACKET_LENGTH) { + this._longPacketBuffers.push(this._buffer.slice(this._packetOffset, this._packetEnd)); + + this._advanceToNextPacket(); + continue; + } + + this._combineLongPacketBuffers(); + + // Try...finally to ensure exception safety. Unfortunately this is costing + // us up to ~10% performance in some benchmarks. + var hadException = true; + try { + this._onPacket(this._packetHeader); + hadException = false; + } catch (err) { + if (!err || typeof err.code !== 'string' || err.code.substr(0, 7) !== 'PARSER_') { + throw err; // Rethrow non-MySQL errors + } + + // Pass down parser errors + this._onError(err); + hadException = false; + } finally { + this._advanceToNextPacket(); + + // If we had an exception, the parser while loop will be broken out + // of after the finally block. So we need to make sure to re-enter it + // to continue parsing any bytes that may already have been received. + if (hadException) { + process.nextTick(this.write.bind(this)); + } + } + } +}; + +Parser.prototype.append = function append(chunk) { + if (!chunk || chunk.length === 0) { + return; + } + + // Calculate slice ranges + var sliceEnd = this._buffer.length; + var sliceStart = this._packetOffset === null + ? this._offset + : this._packetOffset; + var sliceLength = sliceEnd - sliceStart; + + // Get chunk data + var buffer = null; + var chunks = !(chunk instanceof Array || Array.isArray(chunk)) ? [chunk] : chunk; + var length = 0; + var offset = 0; + + for (var i = 0; i < chunks.length; i++) { + length += chunks[i].length; + } + + if (sliceLength !== 0) { + // Create a new Buffer + buffer = Buffer.allocUnsafe(sliceLength + length); + offset = 0; + + // Copy data slice + offset += this._buffer.copy(buffer, 0, sliceStart, sliceEnd); + + // Copy chunks + for (var i = 0; i < chunks.length; i++) { + offset += chunks[i].copy(buffer, offset); + } + } else if (chunks.length > 1) { + // Create a new Buffer + buffer = Buffer.allocUnsafe(length); + offset = 0; + + // Copy chunks + for (var i = 0; i < chunks.length; i++) { + offset += chunks[i].copy(buffer, offset); + } + } else { + // Buffer is the only chunk + buffer = chunks[0]; + } + + // Adjust data-tracking pointers + this._buffer = buffer; + this._offset = this._offset - sliceStart; + this._packetEnd = this._packetEnd !== null + ? this._packetEnd - sliceStart + : null; + this._packetOffset = this._packetOffset !== null + ? this._packetOffset - sliceStart + : null; +}; + +Parser.prototype.pause = function() { + this._paused = true; +}; + +Parser.prototype.resume = function() { + this._paused = false; + + // nextTick() to avoid entering write() multiple times within the same stack + // which would cause problems as write manipulates the state of the object. + process.nextTick(this.write.bind(this)); +}; + +Parser.prototype.peak = function peak(offset) { + return this._buffer[this._offset + (offset >>> 0)]; +}; + +Parser.prototype.parseUnsignedNumber = function parseUnsignedNumber(bytes) { + if (bytes === 1) { + return this._buffer[this._offset++]; + } + + var buffer = this._buffer; + var offset = this._offset + bytes - 1; + var value = 0; + + if (bytes > 4) { + var err = new Error('parseUnsignedNumber: Supports only up to 4 bytes'); + err.offset = (this._offset - this._packetOffset - 1); + err.code = 'PARSER_UNSIGNED_TOO_LONG'; + throw err; + } + + while (offset >= this._offset) { + value = ((value << 8) | buffer[offset]) >>> 0; + offset--; + } + + this._offset += bytes; + + return value; +}; + +Parser.prototype.parseLengthCodedString = function() { + var length = this.parseLengthCodedNumber(); + + if (length === null) { + return null; + } + + return this.parseString(length); +}; + +Parser.prototype.parseLengthCodedBuffer = function() { + var length = this.parseLengthCodedNumber(); + + if (length === null) { + return null; + } + + return this.parseBuffer(length); +}; + +Parser.prototype.parseLengthCodedNumber = function parseLengthCodedNumber() { + if (this._offset >= this._buffer.length) { + var err = new Error('Parser: read past end'); + err.offset = (this._offset - this._packetOffset); + err.code = 'PARSER_READ_PAST_END'; + throw err; + } + + var bits = this._buffer[this._offset++]; + + if (bits <= 250) { + return bits; + } + + switch (bits) { + case 251: + return null; + case 252: + return this.parseUnsignedNumber(2); + case 253: + return this.parseUnsignedNumber(3); + case 254: + break; + default: + var err = new Error('Unexpected first byte' + (bits ? ': 0x' + bits.toString(16) : '')); + err.offset = (this._offset - this._packetOffset - 1); + err.code = 'PARSER_BAD_LENGTH_BYTE'; + throw err; + } + + var low = this.parseUnsignedNumber(4); + var high = this.parseUnsignedNumber(4); + var value; + + if (high >>> 21) { + value = (new BigNumber(low)).plus((new BigNumber(MUL_32BIT)).times(high)).toString(); + + if (this._supportBigNumbers) { + return value; + } + + var err = new Error( + 'parseLengthCodedNumber: JS precision range exceeded, ' + + 'number is >= 53 bit: "' + value + '"' + ); + err.offset = (this._offset - this._packetOffset - 8); + err.code = 'PARSER_JS_PRECISION_RANGE_EXCEEDED'; + throw err; + } + + value = low + (MUL_32BIT * high); + + return value; +}; + +Parser.prototype.parseFiller = function(length) { + return this.parseBuffer(length); +}; + +Parser.prototype.parseNullTerminatedBuffer = function() { + var end = this._nullByteOffset(); + var value = this._buffer.slice(this._offset, end); + this._offset = end + 1; + + return value; +}; + +Parser.prototype.parseNullTerminatedString = function() { + var end = this._nullByteOffset(); + var value = this._buffer.toString(this._encoding, this._offset, end); + this._offset = end + 1; + + return value; +}; + +Parser.prototype._nullByteOffset = function() { + var offset = this._offset; + + while (this._buffer[offset] !== 0x00) { + offset++; + + if (offset >= this._buffer.length) { + var err = new Error('Offset of null terminated string not found.'); + err.offset = (this._offset - this._packetOffset); + err.code = 'PARSER_MISSING_NULL_BYTE'; + throw err; + } + } + + return offset; +}; + +Parser.prototype.parsePacketTerminatedBuffer = function parsePacketTerminatedBuffer() { + var length = this._packetEnd - this._offset; + return this.parseBuffer(length); +}; + +Parser.prototype.parsePacketTerminatedString = function() { + var length = this._packetEnd - this._offset; + return this.parseString(length); +}; + +Parser.prototype.parseBuffer = function(length) { + var response = Buffer.alloc(length); + this._buffer.copy(response, 0, this._offset, this._offset + length); + + this._offset += length; + return response; +}; + +Parser.prototype.parseString = function(length) { + var offset = this._offset; + var end = offset + length; + var value = this._buffer.toString(this._encoding, offset, end); + + this._offset = end; + return value; +}; + +Parser.prototype.parseGeometryValue = function() { + var buffer = this.parseLengthCodedBuffer(); + var offset = 4; + + if (buffer === null || !buffer.length) { + return null; + } + + function parseGeometry() { + var result = null; + var byteOrder = buffer.readUInt8(offset); offset += 1; + var wkbType = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + switch (wkbType) { + case 1: // WKBPoint + var x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + var y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + result = {x: x, y: y}; + break; + case 2: // WKBLineString + var numPoints = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + result = []; + for (var i = numPoints; i > 0; i--) { + var x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + var y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + result.push({x: x, y: y}); + } + break; + case 3: // WKBPolygon + var numRings = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + result = []; + for (var i = numRings; i > 0; i--) { + var numPoints = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + var line = []; + for (var j = numPoints; j > 0; j--) { + var x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + var y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + line.push({x: x, y: y}); + } + result.push(line); + } + break; + case 4: // WKBMultiPoint + case 5: // WKBMultiLineString + case 6: // WKBMultiPolygon + case 7: // WKBGeometryCollection + var num = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + var result = []; + for (var i = num; i > 0; i--) { + result.push(parseGeometry()); + } + break; + } + return result; + } + return parseGeometry(); +}; + +Parser.prototype.reachedPacketEnd = function() { + return this._offset === this._packetEnd; +}; + +Parser.prototype.incrementPacketNumber = function() { + var currentPacketNumber = this._nextPacketNumber; + this._nextPacketNumber = (this._nextPacketNumber + 1) % 256; + + return currentPacketNumber; +}; + +Parser.prototype.resetPacketNumber = function() { + this._nextPacketNumber = 0; +}; + +Parser.prototype.packetLength = function packetLength() { + if (!this._packetHeader) { + return null; + } + + return this._packetHeader.length + this._longPacketBuffers.size; +}; + +Parser.prototype._combineNextBuffers = function _combineNextBuffers(bytes) { + var length = this._buffer.length - this._offset; + + if (length >= bytes) { + return true; + } + + if ((length + this._nextBuffers.size) < bytes) { + return false; + } + + var buffers = []; + var bytesNeeded = bytes - length; + + while (bytesNeeded > 0) { + var buffer = this._nextBuffers.shift(); + buffers.push(buffer); + bytesNeeded -= buffer.length; + } + + this.append(buffers); + return true; +}; + +Parser.prototype._combineLongPacketBuffers = function _combineLongPacketBuffers() { + if (!this._longPacketBuffers.size) { + return; + } + + // Calculate bytes + var remainingBytes = this._buffer.length - this._offset; + var trailingPacketBytes = this._buffer.length - this._packetEnd; + + // Create buffer + var buf = null; + var buffer = Buffer.allocUnsafe(remainingBytes + this._longPacketBuffers.size); + var offset = 0; + + // Copy long buffers + while ((buf = this._longPacketBuffers.shift())) { + offset += buf.copy(buffer, offset); + } + + // Copy remaining bytes + this._buffer.copy(buffer, offset, this._offset); + + this._buffer = buffer; + this._offset = 0; + this._packetEnd = this._buffer.length - trailingPacketBytes; + this._packetOffset = 0; +}; + +Parser.prototype._advanceToNextPacket = function() { + this._offset = this._packetEnd; + this._packetHeader = null; + this._packetEnd = null; + this._packetOffset = null; +}; + + +/***/ }), +/* 37 */ +/***/ (function(module, exports) { + +module.exports = PacketHeader; +function PacketHeader(length, number) { + this.length = length; + this.number = number; +} + + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + +var __WEBPACK_AMD_DEFINE_RESULT__;/*! bignumber.js v4.1.0 https://github.com/MikeMcl/bignumber.js/LICENCE */ + +;(function (globalObj) { + 'use strict'; + + /* + bignumber.js v4.1.0 + A JavaScript library for arbitrary-precision arithmetic. + https://github.com/MikeMcl/bignumber.js + Copyright (c) 2017 Michael Mclaughlin + MIT Expat Licence + */ + + + var BigNumber, + isNumeric = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, + mathceil = Math.ceil, + mathfloor = Math.floor, + notBool = ' not a boolean or binary digit', + roundingMode = 'rounding mode', + tooManyDigits = 'number type has more than 15 significant digits', + ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_', + BASE = 1e14, + LOG_BASE = 14, + MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1 + // MAX_INT32 = 0x7fffffff, // 2^31 - 1 + POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13], + SQRT_BASE = 1e7, + + /* + * The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and + * the arguments to toExponential, toFixed, toFormat, and toPrecision, beyond which an + * exception is thrown (if ERRORS is true). + */ + MAX = 1E9; // 0 to MAX_INT32 + + + /* + * Create and return a BigNumber constructor. + */ + function constructorFactory(config) { + var div, parseNumeric, + + // id tracks the caller function, so its name can be included in error messages. + id = 0, + P = BigNumber.prototype, + ONE = new BigNumber(1), + + + /********************************* EDITABLE DEFAULTS **********************************/ + + + /* + * The default values below must be integers within the inclusive ranges stated. + * The values can also be changed at run-time using BigNumber.config. + */ + + // The maximum number of decimal places for operations involving division. + DECIMAL_PLACES = 20, // 0 to MAX + + /* + * The rounding mode used when rounding to the above decimal places, and when using + * toExponential, toFixed, toFormat and toPrecision, and round (default value). + * UP 0 Away from zero. + * DOWN 1 Towards zero. + * CEIL 2 Towards +Infinity. + * FLOOR 3 Towards -Infinity. + * HALF_UP 4 Towards nearest neighbour. If equidistant, up. + * HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. + * HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. + * HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. + * HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. + */ + ROUNDING_MODE = 4, // 0 to 8 + + // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS] + + // The exponent value at and beneath which toString returns exponential notation. + // Number type: -7 + TO_EXP_NEG = -7, // 0 to -MAX + + // The exponent value at and above which toString returns exponential notation. + // Number type: 21 + TO_EXP_POS = 21, // 0 to MAX + + // RANGE : [MIN_EXP, MAX_EXP] + + // The minimum exponent value, beneath which underflow to zero occurs. + // Number type: -324 (5e-324) + MIN_EXP = -1e7, // -1 to -MAX + + // The maximum exponent value, above which overflow to Infinity occurs. + // Number type: 308 (1.7976931348623157e+308) + // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow. + MAX_EXP = 1e7, // 1 to MAX + + // Whether BigNumber Errors are ever thrown. + ERRORS = true, // true or false + + // Change to intValidatorNoErrors if ERRORS is false. + isValidInt = intValidatorWithErrors, // intValidatorWithErrors/intValidatorNoErrors + + // Whether to use cryptographically-secure random number generation, if available. + CRYPTO = false, // true or false + + /* + * The modulo mode used when calculating the modulus: a mod n. + * The quotient (q = a / n) is calculated according to the corresponding rounding mode. + * The remainder (r) is calculated as: r = a - n * q. + * + * UP 0 The remainder is positive if the dividend is negative, else is negative. + * DOWN 1 The remainder has the same sign as the dividend. + * This modulo mode is commonly known as 'truncated division' and is + * equivalent to (a % n) in JavaScript. + * FLOOR 3 The remainder has the same sign as the divisor (Python %). + * HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function. + * EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). + * The remainder is always positive. + * + * The truncated division, floored division, Euclidian division and IEEE 754 remainder + * modes are commonly used for the modulus operation. + * Although the other rounding modes can also be used, they may not give useful results. + */ + MODULO_MODE = 1, // 0 to 9 + + // The maximum number of significant digits of the result of the toPower operation. + // If POW_PRECISION is 0, there will be unlimited significant digits. + POW_PRECISION = 0, // 0 to MAX + + // The format specification used by the BigNumber.prototype.toFormat method. + FORMAT = { + decimalSeparator: '.', + groupSeparator: ',', + groupSize: 3, + secondaryGroupSize: 0, + fractionGroupSeparator: '\xA0', // non-breaking space + fractionGroupSize: 0 + }; + + + /******************************************************************************************/ + + + // CONSTRUCTOR + + + /* + * The BigNumber constructor and exported function. + * Create and return a new instance of a BigNumber object. + * + * n {number|string|BigNumber} A numeric value. + * [b] {number} The base of n. Integer, 2 to 64 inclusive. + */ + function BigNumber( n, b ) { + var c, e, i, num, len, str, + x = this; + + // Enable constructor usage without new. + if ( !( x instanceof BigNumber ) ) { + + // 'BigNumber() constructor call without new: {n}' + if (ERRORS) raise( 26, 'constructor call without new', n ); + return new BigNumber( n, b ); + } + + // 'new BigNumber() base not an integer: {b}' + // 'new BigNumber() base out of range: {b}' + if ( b == null || !isValidInt( b, 2, 64, id, 'base' ) ) { + + // Duplicate. + if ( n instanceof BigNumber ) { + x.s = n.s; + x.e = n.e; + x.c = ( n = n.c ) ? n.slice() : n; + id = 0; + return; + } + + if ( ( num = typeof n == 'number' ) && n * 0 == 0 ) { + x.s = 1 / n < 0 ? ( n = -n, -1 ) : 1; + + // Fast path for integers. + if ( n === ~~n ) { + for ( e = 0, i = n; i >= 10; i /= 10, e++ ); + x.e = e; + x.c = [n]; + id = 0; + return; + } + + str = n + ''; + } else { + if ( !isNumeric.test( str = n + '' ) ) return parseNumeric( x, str, num ); + x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1; + } + } else { + b = b | 0; + str = n + ''; + + // Ensure return value is rounded to DECIMAL_PLACES as with other bases. + // Allow exponential notation to be used with base 10 argument. + if ( b == 10 ) { + x = new BigNumber( n instanceof BigNumber ? n : str ); + return round( x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE ); + } + + // Avoid potential interpretation of Infinity and NaN as base 44+ values. + // Any number in exponential form will fail due to the [Ee][+-]. + if ( ( num = typeof n == 'number' ) && n * 0 != 0 || + !( new RegExp( '^-?' + ( c = '[' + ALPHABET.slice( 0, b ) + ']+' ) + + '(?:\\.' + c + ')?$',b < 37 ? 'i' : '' ) ).test(str) ) { + return parseNumeric( x, str, num, b ); + } + + if (num) { + x.s = 1 / n < 0 ? ( str = str.slice(1), -1 ) : 1; + + if ( ERRORS && str.replace( /^0\.0*|\./, '' ).length > 15 ) { + + // 'new BigNumber() number type has more than 15 significant digits: {n}' + raise( id, tooManyDigits, n ); + } + + // Prevent later check for length on converted number. + num = false; + } else { + x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1; + } + + str = convertBase( str, 10, b, x.s ); + } + + // Decimal point? + if ( ( e = str.indexOf('.') ) > -1 ) str = str.replace( '.', '' ); + + // Exponential form? + if ( ( i = str.search( /e/i ) ) > 0 ) { + + // Determine exponent. + if ( e < 0 ) e = i; + e += +str.slice( i + 1 ); + str = str.substring( 0, i ); + } else if ( e < 0 ) { + + // Integer. + e = str.length; + } + + // Determine leading zeros. + for ( i = 0; str.charCodeAt(i) === 48; i++ ); + + // Determine trailing zeros. + for ( len = str.length; str.charCodeAt(--len) === 48; ); + str = str.slice( i, len + 1 ); + + if (str) { + len = str.length; + + // Disallow numbers with over 15 significant digits if number type. + // 'new BigNumber() number type has more than 15 significant digits: {n}' + if ( num && ERRORS && len > 15 && ( n > MAX_SAFE_INTEGER || n !== mathfloor(n) ) ) { + raise( id, tooManyDigits, x.s * n ); + } + + e = e - i - 1; + + // Overflow? + if ( e > MAX_EXP ) { + + // Infinity. + x.c = x.e = null; + + // Underflow? + } else if ( e < MIN_EXP ) { + + // Zero. + x.c = [ x.e = 0 ]; + } else { + x.e = e; + x.c = []; + + // Transform base + + // e is the base 10 exponent. + // i is where to slice str to get the first element of the coefficient array. + i = ( e + 1 ) % LOG_BASE; + if ( e < 0 ) i += LOG_BASE; + + if ( i < len ) { + if (i) x.c.push( +str.slice( 0, i ) ); + + for ( len -= LOG_BASE; i < len; ) { + x.c.push( +str.slice( i, i += LOG_BASE ) ); + } + + str = str.slice(i); + i = LOG_BASE - str.length; + } else { + i -= len; + } + + for ( ; i--; str += '0' ); + x.c.push( +str ); + } + } else { + + // Zero. + x.c = [ x.e = 0 ]; + } + + id = 0; + } + + + // CONSTRUCTOR PROPERTIES + + + BigNumber.another = constructorFactory; + + BigNumber.ROUND_UP = 0; + BigNumber.ROUND_DOWN = 1; + BigNumber.ROUND_CEIL = 2; + BigNumber.ROUND_FLOOR = 3; + BigNumber.ROUND_HALF_UP = 4; + BigNumber.ROUND_HALF_DOWN = 5; + BigNumber.ROUND_HALF_EVEN = 6; + BigNumber.ROUND_HALF_CEIL = 7; + BigNumber.ROUND_HALF_FLOOR = 8; + BigNumber.EUCLID = 9; + + + /* + * Configure infrequently-changing library-wide settings. + * + * Accept an object or an argument list, with one or many of the following properties or + * parameters respectively: + * + * DECIMAL_PLACES {number} Integer, 0 to MAX inclusive + * ROUNDING_MODE {number} Integer, 0 to 8 inclusive + * EXPONENTIAL_AT {number|number[]} Integer, -MAX to MAX inclusive or + * [integer -MAX to 0 incl., 0 to MAX incl.] + * RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or + * [integer -MAX to -1 incl., integer 1 to MAX incl.] + * ERRORS {boolean|number} true, false, 1 or 0 + * CRYPTO {boolean|number} true, false, 1 or 0 + * MODULO_MODE {number} 0 to 9 inclusive + * POW_PRECISION {number} 0 to MAX inclusive + * FORMAT {object} See BigNumber.prototype.toFormat + * decimalSeparator {string} + * groupSeparator {string} + * groupSize {number} + * secondaryGroupSize {number} + * fractionGroupSeparator {string} + * fractionGroupSize {number} + * + * (The values assigned to the above FORMAT object properties are not checked for validity.) + * + * E.g. + * BigNumber.config(20, 4) is equivalent to + * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 }) + * + * Ignore properties/parameters set to null or undefined. + * Return an object with the properties current values. + */ + BigNumber.config = BigNumber.set = function () { + var v, p, + i = 0, + r = {}, + a = arguments, + o = a[0], + has = o && typeof o == 'object' + ? function () { if ( o.hasOwnProperty(p) ) return ( v = o[p] ) != null; } + : function () { if ( a.length > i ) return ( v = a[i++] ) != null; }; + + // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive. + // 'config() DECIMAL_PLACES not an integer: {v}' + // 'config() DECIMAL_PLACES out of range: {v}' + if ( has( p = 'DECIMAL_PLACES' ) && isValidInt( v, 0, MAX, 2, p ) ) { + DECIMAL_PLACES = v | 0; + } + r[p] = DECIMAL_PLACES; + + // ROUNDING_MODE {number} Integer, 0 to 8 inclusive. + // 'config() ROUNDING_MODE not an integer: {v}' + // 'config() ROUNDING_MODE out of range: {v}' + if ( has( p = 'ROUNDING_MODE' ) && isValidInt( v, 0, 8, 2, p ) ) { + ROUNDING_MODE = v | 0; + } + r[p] = ROUNDING_MODE; + + // EXPONENTIAL_AT {number|number[]} + // Integer, -MAX to MAX inclusive or [integer -MAX to 0 inclusive, 0 to MAX inclusive]. + // 'config() EXPONENTIAL_AT not an integer: {v}' + // 'config() EXPONENTIAL_AT out of range: {v}' + if ( has( p = 'EXPONENTIAL_AT' ) ) { + + if ( isArray(v) ) { + if ( isValidInt( v[0], -MAX, 0, 2, p ) && isValidInt( v[1], 0, MAX, 2, p ) ) { + TO_EXP_NEG = v[0] | 0; + TO_EXP_POS = v[1] | 0; + } + } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) { + TO_EXP_NEG = -( TO_EXP_POS = ( v < 0 ? -v : v ) | 0 ); + } + } + r[p] = [ TO_EXP_NEG, TO_EXP_POS ]; + + // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or + // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive]. + // 'config() RANGE not an integer: {v}' + // 'config() RANGE cannot be zero: {v}' + // 'config() RANGE out of range: {v}' + if ( has( p = 'RANGE' ) ) { + + if ( isArray(v) ) { + if ( isValidInt( v[0], -MAX, -1, 2, p ) && isValidInt( v[1], 1, MAX, 2, p ) ) { + MIN_EXP = v[0] | 0; + MAX_EXP = v[1] | 0; + } + } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) { + if ( v | 0 ) MIN_EXP = -( MAX_EXP = ( v < 0 ? -v : v ) | 0 ); + else if (ERRORS) raise( 2, p + ' cannot be zero', v ); + } + } + r[p] = [ MIN_EXP, MAX_EXP ]; + + // ERRORS {boolean|number} true, false, 1 or 0. + // 'config() ERRORS not a boolean or binary digit: {v}' + if ( has( p = 'ERRORS' ) ) { + + if ( v === !!v || v === 1 || v === 0 ) { + id = 0; + isValidInt = ( ERRORS = !!v ) ? intValidatorWithErrors : intValidatorNoErrors; + } else if (ERRORS) { + raise( 2, p + notBool, v ); + } + } + r[p] = ERRORS; + + // CRYPTO {boolean|number} true, false, 1 or 0. + // 'config() CRYPTO not a boolean or binary digit: {v}' + // 'config() crypto unavailable: {crypto}' + if ( has( p = 'CRYPTO' ) ) { + + if ( v === true || v === false || v === 1 || v === 0 ) { + if (v) { + v = typeof crypto == 'undefined'; + if ( !v && crypto && (crypto.getRandomValues || crypto.randomBytes)) { + CRYPTO = true; + } else if (ERRORS) { + raise( 2, 'crypto unavailable', v ? void 0 : crypto ); + } else { + CRYPTO = false; + } + } else { + CRYPTO = false; + } + } else if (ERRORS) { + raise( 2, p + notBool, v ); + } + } + r[p] = CRYPTO; + + // MODULO_MODE {number} Integer, 0 to 9 inclusive. + // 'config() MODULO_MODE not an integer: {v}' + // 'config() MODULO_MODE out of range: {v}' + if ( has( p = 'MODULO_MODE' ) && isValidInt( v, 0, 9, 2, p ) ) { + MODULO_MODE = v | 0; + } + r[p] = MODULO_MODE; + + // POW_PRECISION {number} Integer, 0 to MAX inclusive. + // 'config() POW_PRECISION not an integer: {v}' + // 'config() POW_PRECISION out of range: {v}' + if ( has( p = 'POW_PRECISION' ) && isValidInt( v, 0, MAX, 2, p ) ) { + POW_PRECISION = v | 0; + } + r[p] = POW_PRECISION; + + // FORMAT {object} + // 'config() FORMAT not an object: {v}' + if ( has( p = 'FORMAT' ) ) { + + if ( typeof v == 'object' ) { + FORMAT = v; + } else if (ERRORS) { + raise( 2, p + ' not an object', v ); + } + } + r[p] = FORMAT; + + return r; + }; + + + /* + * Return a new BigNumber whose value is the maximum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.max = function () { return maxOrMin( arguments, P.lt ); }; + + + /* + * Return a new BigNumber whose value is the minimum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.min = function () { return maxOrMin( arguments, P.gt ); }; + + + /* + * Return a new BigNumber with a random value equal to or greater than 0 and less than 1, + * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing + * zeros are produced). + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * + * 'random() decimal places not an integer: {dp}' + * 'random() decimal places out of range: {dp}' + * 'random() crypto unavailable: {crypto}' + */ + BigNumber.random = (function () { + var pow2_53 = 0x20000000000000; + + // Return a 53 bit integer n, where 0 <= n < 9007199254740992. + // Check if Math.random() produces more than 32 bits of randomness. + // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits. + // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1. + var random53bitInt = (Math.random() * pow2_53) & 0x1fffff + ? function () { return mathfloor( Math.random() * pow2_53 ); } + : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) + + (Math.random() * 0x800000 | 0); }; + + return function (dp) { + var a, b, e, k, v, + i = 0, + c = [], + rand = new BigNumber(ONE); + + dp = dp == null || !isValidInt( dp, 0, MAX, 14 ) ? DECIMAL_PLACES : dp | 0; + k = mathceil( dp / LOG_BASE ); + + if (CRYPTO) { + + // Browsers supporting crypto.getRandomValues. + if (crypto.getRandomValues) { + + a = crypto.getRandomValues( new Uint32Array( k *= 2 ) ); + + for ( ; i < k; ) { + + // 53 bits: + // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2) + // 11111 11111111 11111111 11111111 11100000 00000000 00000000 + // ((Math.pow(2, 32) - 1) >>> 11).toString(2) + // 11111 11111111 11111111 + // 0x20000 is 2^21. + v = a[i] * 0x20000 + (a[i + 1] >>> 11); + + // Rejection sampling: + // 0 <= v < 9007199254740992 + // Probability that v >= 9e15, is + // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251 + if ( v >= 9e15 ) { + b = crypto.getRandomValues( new Uint32Array(2) ); + a[i] = b[0]; + a[i + 1] = b[1]; + } else { + + // 0 <= v <= 8999999999999999 + // 0 <= (v % 1e14) <= 99999999999999 + c.push( v % 1e14 ); + i += 2; + } + } + i = k / 2; + + // Node.js supporting crypto.randomBytes. + } else if (crypto.randomBytes) { + + // buffer + a = crypto.randomBytes( k *= 7 ); + + for ( ; i < k; ) { + + // 0x1000000000000 is 2^48, 0x10000000000 is 2^40 + // 0x100000000 is 2^32, 0x1000000 is 2^24 + // 11111 11111111 11111111 11111111 11111111 11111111 11111111 + // 0 <= v < 9007199254740992 + v = ( ( a[i] & 31 ) * 0x1000000000000 ) + ( a[i + 1] * 0x10000000000 ) + + ( a[i + 2] * 0x100000000 ) + ( a[i + 3] * 0x1000000 ) + + ( a[i + 4] << 16 ) + ( a[i + 5] << 8 ) + a[i + 6]; + + if ( v >= 9e15 ) { + crypto.randomBytes(7).copy( a, i ); + } else { + + // 0 <= (v % 1e14) <= 99999999999999 + c.push( v % 1e14 ); + i += 7; + } + } + i = k / 7; + } else { + CRYPTO = false; + if (ERRORS) raise( 14, 'crypto unavailable', crypto ); + } + } + + // Use Math.random. + if (!CRYPTO) { + + for ( ; i < k; ) { + v = random53bitInt(); + if ( v < 9e15 ) c[i++] = v % 1e14; + } + } + + k = c[--i]; + dp %= LOG_BASE; + + // Convert trailing digits to zeros according to dp. + if ( k && dp ) { + v = POWS_TEN[LOG_BASE - dp]; + c[i] = mathfloor( k / v ) * v; + } + + // Remove trailing elements which are zero. + for ( ; c[i] === 0; c.pop(), i-- ); + + // Zero? + if ( i < 0 ) { + c = [ e = 0 ]; + } else { + + // Remove leading elements which are zero and adjust exponent accordingly. + for ( e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE); + + // Count the digits of the first element of c to determine leading zeros, and... + for ( i = 1, v = c[0]; v >= 10; v /= 10, i++); + + // adjust the exponent accordingly. + if ( i < LOG_BASE ) e -= LOG_BASE - i; + } + + rand.e = e; + rand.c = c; + return rand; + }; + })(); + + + // PRIVATE FUNCTIONS + + + // Convert a numeric string of baseIn to a numeric string of baseOut. + function convertBase( str, baseOut, baseIn, sign ) { + var d, e, k, r, x, xc, y, + i = str.indexOf( '.' ), + dp = DECIMAL_PLACES, + rm = ROUNDING_MODE; + + if ( baseIn < 37 ) str = str.toLowerCase(); + + // Non-integer. + if ( i >= 0 ) { + k = POW_PRECISION; + + // Unlimited precision. + POW_PRECISION = 0; + str = str.replace( '.', '' ); + y = new BigNumber(baseIn); + x = y.pow( str.length - i ); + POW_PRECISION = k; + + // Convert str as if an integer, then restore the fraction part by dividing the + // result by its base raised to a power. + y.c = toBaseOut( toFixedPoint( coeffToString( x.c ), x.e ), 10, baseOut ); + y.e = y.c.length; + } + + // Convert the number as integer. + xc = toBaseOut( str, baseIn, baseOut ); + e = k = xc.length; + + // Remove trailing zeros. + for ( ; xc[--k] == 0; xc.pop() ); + if ( !xc[0] ) return '0'; + + if ( i < 0 ) { + --e; + } else { + x.c = xc; + x.e = e; + + // sign is needed for correct rounding. + x.s = sign; + x = div( x, y, dp, rm, baseOut ); + xc = x.c; + r = x.r; + e = x.e; + } + + d = e + dp + 1; + + // The rounding digit, i.e. the digit to the right of the digit that may be rounded up. + i = xc[d]; + k = baseOut / 2; + r = r || d < 0 || xc[d + 1] != null; + + r = rm < 4 ? ( i != null || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) ) + : i > k || i == k &&( rm == 4 || r || rm == 6 && xc[d - 1] & 1 || + rm == ( x.s < 0 ? 8 : 7 ) ); + + if ( d < 1 || !xc[0] ) { + + // 1^-dp or 0. + str = r ? toFixedPoint( '1', -dp ) : '0'; + } else { + xc.length = d; + + if (r) { + + // Rounding up may mean the previous digit has to be rounded up and so on. + for ( --baseOut; ++xc[--d] > baseOut; ) { + xc[d] = 0; + + if ( !d ) { + ++e; + xc = [1].concat(xc); + } + } + } + + // Determine trailing zeros. + for ( k = xc.length; !xc[--k]; ); + + // E.g. [4, 11, 15] becomes 4bf. + for ( i = 0, str = ''; i <= k; str += ALPHABET.charAt( xc[i++] ) ); + str = toFixedPoint( str, e ); + } + + // The caller will add the sign. + return str; + } + + + // Perform division in the specified base. Called by div and convertBase. + div = (function () { + + // Assume non-zero x and k. + function multiply( x, k, base ) { + var m, temp, xlo, xhi, + carry = 0, + i = x.length, + klo = k % SQRT_BASE, + khi = k / SQRT_BASE | 0; + + for ( x = x.slice(); i--; ) { + xlo = x[i] % SQRT_BASE; + xhi = x[i] / SQRT_BASE | 0; + m = khi * xlo + xhi * klo; + temp = klo * xlo + ( ( m % SQRT_BASE ) * SQRT_BASE ) + carry; + carry = ( temp / base | 0 ) + ( m / SQRT_BASE | 0 ) + khi * xhi; + x[i] = temp % base; + } + + if (carry) x = [carry].concat(x); + + return x; + } + + function compare( a, b, aL, bL ) { + var i, cmp; + + if ( aL != bL ) { + cmp = aL > bL ? 1 : -1; + } else { + + for ( i = cmp = 0; i < aL; i++ ) { + + if ( a[i] != b[i] ) { + cmp = a[i] > b[i] ? 1 : -1; + break; + } + } + } + return cmp; + } + + function subtract( a, b, aL, base ) { + var i = 0; + + // Subtract b from a. + for ( ; aL--; ) { + a[aL] -= i; + i = a[aL] < b[aL] ? 1 : 0; + a[aL] = i * base + a[aL] - b[aL]; + } + + // Remove leading zeros. + for ( ; !a[0] && a.length > 1; a.splice(0, 1) ); + } + + // x: dividend, y: divisor. + return function ( x, y, dp, rm, base ) { + var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0, + yL, yz, + s = x.s == y.s ? 1 : -1, + xc = x.c, + yc = y.c; + + // Either NaN, Infinity or 0? + if ( !xc || !xc[0] || !yc || !yc[0] ) { + + return new BigNumber( + + // Return NaN if either NaN, or both Infinity or 0. + !x.s || !y.s || ( xc ? yc && xc[0] == yc[0] : !yc ) ? NaN : + + // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0. + xc && xc[0] == 0 || !yc ? s * 0 : s / 0 + ); + } + + q = new BigNumber(s); + qc = q.c = []; + e = x.e - y.e; + s = dp + e + 1; + + if ( !base ) { + base = BASE; + e = bitFloor( x.e / LOG_BASE ) - bitFloor( y.e / LOG_BASE ); + s = s / LOG_BASE | 0; + } + + // Result exponent may be one less then the current value of e. + // The coefficients of the BigNumbers from convertBase may have trailing zeros. + for ( i = 0; yc[i] == ( xc[i] || 0 ); i++ ); + if ( yc[i] > ( xc[i] || 0 ) ) e--; + + if ( s < 0 ) { + qc.push(1); + more = true; + } else { + xL = xc.length; + yL = yc.length; + i = 0; + s += 2; + + // Normalise xc and yc so highest order digit of yc is >= base / 2. + + n = mathfloor( base / ( yc[0] + 1 ) ); + + // Not necessary, but to handle odd bases where yc[0] == ( base / 2 ) - 1. + // if ( n > 1 || n++ == 1 && yc[0] < base / 2 ) { + if ( n > 1 ) { + yc = multiply( yc, n, base ); + xc = multiply( xc, n, base ); + yL = yc.length; + xL = xc.length; + } + + xi = yL; + rem = xc.slice( 0, yL ); + remL = rem.length; + + // Add zeros to make remainder as long as divisor. + for ( ; remL < yL; rem[remL++] = 0 ); + yz = yc.slice(); + yz = [0].concat(yz); + yc0 = yc[0]; + if ( yc[1] >= base / 2 ) yc0++; + // Not necessary, but to prevent trial digit n > base, when using base 3. + // else if ( base == 3 && yc0 == 1 ) yc0 = 1 + 1e-15; + + do { + n = 0; + + // Compare divisor and remainder. + cmp = compare( yc, rem, yL, remL ); + + // If divisor < remainder. + if ( cmp < 0 ) { + + // Calculate trial digit, n. + + rem0 = rem[0]; + if ( yL != remL ) rem0 = rem0 * base + ( rem[1] || 0 ); + + // n is how many times the divisor goes into the current remainder. + n = mathfloor( rem0 / yc0 ); + + // Algorithm: + // 1. product = divisor * trial digit (n) + // 2. if product > remainder: product -= divisor, n-- + // 3. remainder -= product + // 4. if product was < remainder at 2: + // 5. compare new remainder and divisor + // 6. If remainder > divisor: remainder -= divisor, n++ + + if ( n > 1 ) { + + // n may be > base only when base is 3. + if (n >= base) n = base - 1; + + // product = divisor * trial digit. + prod = multiply( yc, n, base ); + prodL = prod.length; + remL = rem.length; + + // Compare product and remainder. + // If product > remainder. + // Trial digit n too high. + // n is 1 too high about 5% of the time, and is not known to have + // ever been more than 1 too high. + while ( compare( prod, rem, prodL, remL ) == 1 ) { + n--; + + // Subtract divisor from product. + subtract( prod, yL < prodL ? yz : yc, prodL, base ); + prodL = prod.length; + cmp = 1; + } + } else { + + // n is 0 or 1, cmp is -1. + // If n is 0, there is no need to compare yc and rem again below, + // so change cmp to 1 to avoid it. + // If n is 1, leave cmp as -1, so yc and rem are compared again. + if ( n == 0 ) { + + // divisor < remainder, so n must be at least 1. + cmp = n = 1; + } + + // product = divisor + prod = yc.slice(); + prodL = prod.length; + } + + if ( prodL < remL ) prod = [0].concat(prod); + + // Subtract product from remainder. + subtract( rem, prod, remL, base ); + remL = rem.length; + + // If product was < remainder. + if ( cmp == -1 ) { + + // Compare divisor and new remainder. + // If divisor < new remainder, subtract divisor from remainder. + // Trial digit n too low. + // n is 1 too low about 5% of the time, and very rarely 2 too low. + while ( compare( yc, rem, yL, remL ) < 1 ) { + n++; + + // Subtract divisor from remainder. + subtract( rem, yL < remL ? yz : yc, remL, base ); + remL = rem.length; + } + } + } else if ( cmp === 0 ) { + n++; + rem = [0]; + } // else cmp === 1 and n will be 0 + + // Add the next digit, n, to the result array. + qc[i++] = n; + + // Update the remainder. + if ( rem[0] ) { + rem[remL++] = xc[xi] || 0; + } else { + rem = [ xc[xi] ]; + remL = 1; + } + } while ( ( xi++ < xL || rem[0] != null ) && s-- ); + + more = rem[0] != null; + + // Leading zero? + if ( !qc[0] ) qc.splice(0, 1); + } + + if ( base == BASE ) { + + // To calculate q.e, first get the number of digits of qc[0]. + for ( i = 1, s = qc[0]; s >= 10; s /= 10, i++ ); + round( q, dp + ( q.e = i + e * LOG_BASE - 1 ) + 1, rm, more ); + + // Caller is convertBase. + } else { + q.e = e; + q.r = +more; + } + + return q; + }; + })(); + + + /* + * Return a string representing the value of BigNumber n in fixed-point or exponential + * notation rounded to the specified decimal places or significant digits. + * + * n is a BigNumber. + * i is the index of the last digit required (i.e. the digit that may be rounded up). + * rm is the rounding mode. + * caller is caller id: toExponential 19, toFixed 20, toFormat 21, toPrecision 24. + */ + function format( n, i, rm, caller ) { + var c0, e, ne, len, str; + + rm = rm != null && isValidInt( rm, 0, 8, caller, roundingMode ) + ? rm | 0 : ROUNDING_MODE; + + if ( !n.c ) return n.toString(); + c0 = n.c[0]; + ne = n.e; + + if ( i == null ) { + str = coeffToString( n.c ); + str = caller == 19 || caller == 24 && ne <= TO_EXP_NEG + ? toExponential( str, ne ) + : toFixedPoint( str, ne ); + } else { + n = round( new BigNumber(n), i, rm ); + + // n.e may have changed if the value was rounded up. + e = n.e; + + str = coeffToString( n.c ); + len = str.length; + + // toPrecision returns exponential notation if the number of significant digits + // specified is less than the number of digits necessary to represent the integer + // part of the value in fixed-point notation. + + // Exponential notation. + if ( caller == 19 || caller == 24 && ( i <= e || e <= TO_EXP_NEG ) ) { + + // Append zeros? + for ( ; len < i; str += '0', len++ ); + str = toExponential( str, e ); + + // Fixed-point notation. + } else { + i -= ne; + str = toFixedPoint( str, e ); + + // Append zeros? + if ( e + 1 > len ) { + if ( --i > 0 ) for ( str += '.'; i--; str += '0' ); + } else { + i += e - len; + if ( i > 0 ) { + if ( e + 1 == len ) str += '.'; + for ( ; i--; str += '0' ); + } + } + } + } + + return n.s < 0 && c0 ? '-' + str : str; + } + + + // Handle BigNumber.max and BigNumber.min. + function maxOrMin( args, method ) { + var m, n, + i = 0; + + if ( isArray( args[0] ) ) args = args[0]; + m = new BigNumber( args[0] ); + + for ( ; ++i < args.length; ) { + n = new BigNumber( args[i] ); + + // If any number is NaN, return NaN. + if ( !n.s ) { + m = n; + break; + } else if ( method.call( m, n ) ) { + m = n; + } + } + + return m; + } + + + /* + * Return true if n is an integer in range, otherwise throw. + * Use for argument validation when ERRORS is true. + */ + function intValidatorWithErrors( n, min, max, caller, name ) { + if ( n < min || n > max || n != truncate(n) ) { + raise( caller, ( name || 'decimal places' ) + + ( n < min || n > max ? ' out of range' : ' not an integer' ), n ); + } + + return true; + } + + + /* + * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP. + * Called by minus, plus and times. + */ + function normalise( n, c, e ) { + var i = 1, + j = c.length; + + // Remove trailing zeros. + for ( ; !c[--j]; c.pop() ); + + // Calculate the base 10 exponent. First get the number of digits of c[0]. + for ( j = c[0]; j >= 10; j /= 10, i++ ); + + // Overflow? + if ( ( e = i + e * LOG_BASE - 1 ) > MAX_EXP ) { + + // Infinity. + n.c = n.e = null; + + // Underflow? + } else if ( e < MIN_EXP ) { + + // Zero. + n.c = [ n.e = 0 ]; + } else { + n.e = e; + n.c = c; + } + + return n; + } + + + // Handle values that fail the validity test in BigNumber. + parseNumeric = (function () { + var basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i, + dotAfter = /^([^.]+)\.$/, + dotBefore = /^\.([^.]+)$/, + isInfinityOrNaN = /^-?(Infinity|NaN)$/, + whitespaceOrPlus = /^\s*\+(?=[\w.])|^\s+|\s+$/g; + + return function ( x, str, num, b ) { + var base, + s = num ? str : str.replace( whitespaceOrPlus, '' ); + + // No exception on ±Infinity or NaN. + if ( isInfinityOrNaN.test(s) ) { + x.s = isNaN(s) ? null : s < 0 ? -1 : 1; + } else { + if ( !num ) { + + // basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i + s = s.replace( basePrefix, function ( m, p1, p2 ) { + base = ( p2 = p2.toLowerCase() ) == 'x' ? 16 : p2 == 'b' ? 2 : 8; + return !b || b == base ? p1 : m; + }); + + if (b) { + base = b; + + // E.g. '1.' to '1', '.1' to '0.1' + s = s.replace( dotAfter, '$1' ).replace( dotBefore, '0.$1' ); + } + + if ( str != s ) return new BigNumber( s, base ); + } + + // 'new BigNumber() not a number: {n}' + // 'new BigNumber() not a base {b} number: {n}' + if (ERRORS) raise( id, 'not a' + ( b ? ' base ' + b : '' ) + ' number', str ); + x.s = null; + } + + x.c = x.e = null; + id = 0; + } + })(); + + + // Throw a BigNumber Error. + function raise( caller, msg, val ) { + var error = new Error( [ + 'new BigNumber', // 0 + 'cmp', // 1 + 'config', // 2 + 'div', // 3 + 'divToInt', // 4 + 'eq', // 5 + 'gt', // 6 + 'gte', // 7 + 'lt', // 8 + 'lte', // 9 + 'minus', // 10 + 'mod', // 11 + 'plus', // 12 + 'precision', // 13 + 'random', // 14 + 'round', // 15 + 'shift', // 16 + 'times', // 17 + 'toDigits', // 18 + 'toExponential', // 19 + 'toFixed', // 20 + 'toFormat', // 21 + 'toFraction', // 22 + 'pow', // 23 + 'toPrecision', // 24 + 'toString', // 25 + 'BigNumber' // 26 + ][caller] + '() ' + msg + ': ' + val ); + + error.name = 'BigNumber Error'; + id = 0; + throw error; + } + + + /* + * Round x to sd significant digits using rounding mode rm. Check for over/under-flow. + * If r is truthy, it is known that there are more digits after the rounding digit. + */ + function round( x, sd, rm, r ) { + var d, i, j, k, n, ni, rd, + xc = x.c, + pows10 = POWS_TEN; + + // if x is not Infinity or NaN... + if (xc) { + + // rd is the rounding digit, i.e. the digit after the digit that may be rounded up. + // n is a base 1e14 number, the value of the element of array x.c containing rd. + // ni is the index of n within x.c. + // d is the number of digits of n. + // i is the index of rd within n including leading zeros. + // j is the actual index of rd within n (if < 0, rd is a leading zero). + out: { + + // Get the number of digits of the first element of xc. + for ( d = 1, k = xc[0]; k >= 10; k /= 10, d++ ); + i = sd - d; + + // If the rounding digit is in the first element of xc... + if ( i < 0 ) { + i += LOG_BASE; + j = sd; + n = xc[ ni = 0 ]; + + // Get the rounding digit at index j of n. + rd = n / pows10[ d - j - 1 ] % 10 | 0; + } else { + ni = mathceil( ( i + 1 ) / LOG_BASE ); + + if ( ni >= xc.length ) { + + if (r) { + + // Needed by sqrt. + for ( ; xc.length <= ni; xc.push(0) ); + n = rd = 0; + d = 1; + i %= LOG_BASE; + j = i - LOG_BASE + 1; + } else { + break out; + } + } else { + n = k = xc[ni]; + + // Get the number of digits of n. + for ( d = 1; k >= 10; k /= 10, d++ ); + + // Get the index of rd within n. + i %= LOG_BASE; + + // Get the index of rd within n, adjusted for leading zeros. + // The number of leading zeros of n is given by LOG_BASE - d. + j = i - LOG_BASE + d; + + // Get the rounding digit at index j of n. + rd = j < 0 ? 0 : n / pows10[ d - j - 1 ] % 10 | 0; + } + } + + r = r || sd < 0 || + + // Are there any non-zero digits after the rounding digit? + // The expression n % pows10[ d - j - 1 ] returns all digits of n to the right + // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714. + xc[ni + 1] != null || ( j < 0 ? n : n % pows10[ d - j - 1 ] ); + + r = rm < 4 + ? ( rd || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) ) + : rd > 5 || rd == 5 && ( rm == 4 || r || rm == 6 && + + // Check whether the digit to the left of the rounding digit is odd. + ( ( i > 0 ? j > 0 ? n / pows10[ d - j ] : 0 : xc[ni - 1] ) % 10 ) & 1 || + rm == ( x.s < 0 ? 8 : 7 ) ); + + if ( sd < 1 || !xc[0] ) { + xc.length = 0; + + if (r) { + + // Convert sd to decimal places. + sd -= x.e + 1; + + // 1, 0.1, 0.01, 0.001, 0.0001 etc. + xc[0] = pows10[ ( LOG_BASE - sd % LOG_BASE ) % LOG_BASE ]; + x.e = -sd || 0; + } else { + + // Zero. + xc[0] = x.e = 0; + } + + return x; + } + + // Remove excess digits. + if ( i == 0 ) { + xc.length = ni; + k = 1; + ni--; + } else { + xc.length = ni + 1; + k = pows10[ LOG_BASE - i ]; + + // E.g. 56700 becomes 56000 if 7 is the rounding digit. + // j > 0 means i > number of leading zeros of n. + xc[ni] = j > 0 ? mathfloor( n / pows10[ d - j ] % pows10[j] ) * k : 0; + } + + // Round up? + if (r) { + + for ( ; ; ) { + + // If the digit to be rounded up is in the first element of xc... + if ( ni == 0 ) { + + // i will be the length of xc[0] before k is added. + for ( i = 1, j = xc[0]; j >= 10; j /= 10, i++ ); + j = xc[0] += k; + for ( k = 1; j >= 10; j /= 10, k++ ); + + // if i != k the length has increased. + if ( i != k ) { + x.e++; + if ( xc[0] == BASE ) xc[0] = 1; + } + + break; + } else { + xc[ni] += k; + if ( xc[ni] != BASE ) break; + xc[ni--] = 0; + k = 1; + } + } + } + + // Remove trailing zeros. + for ( i = xc.length; xc[--i] === 0; xc.pop() ); + } + + // Overflow? Infinity. + if ( x.e > MAX_EXP ) { + x.c = x.e = null; + + // Underflow? Zero. + } else if ( x.e < MIN_EXP ) { + x.c = [ x.e = 0 ]; + } + } + + return x; + } + + + // PROTOTYPE/INSTANCE METHODS + + + /* + * Return a new BigNumber whose value is the absolute value of this BigNumber. + */ + P.absoluteValue = P.abs = function () { + var x = new BigNumber(this); + if ( x.s < 0 ) x.s = 1; + return x; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole + * number in the direction of Infinity. + */ + P.ceil = function () { + return round( new BigNumber(this), this.e + 1, 2 ); + }; + + + /* + * Return + * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b), + * -1 if the value of this BigNumber is less than the value of BigNumber(y, b), + * 0 if they have the same value, + * or null if the value of either is NaN. + */ + P.comparedTo = P.cmp = function ( y, b ) { + id = 1; + return compare( this, new BigNumber( y, b ) ); + }; + + + /* + * Return the number of decimal places of the value of this BigNumber, or null if the value + * of this BigNumber is ±Infinity or NaN. + */ + P.decimalPlaces = P.dp = function () { + var n, v, + c = this.c; + + if ( !c ) return null; + n = ( ( v = c.length - 1 ) - bitFloor( this.e / LOG_BASE ) ) * LOG_BASE; + + // Subtract the number of trailing zeros of the last number. + if ( v = c[v] ) for ( ; v % 10 == 0; v /= 10, n-- ); + if ( n < 0 ) n = 0; + + return n; + }; + + + /* + * n / 0 = I + * n / N = N + * n / I = 0 + * 0 / n = 0 + * 0 / 0 = N + * 0 / N = N + * 0 / I = 0 + * N / n = N + * N / 0 = N + * N / N = N + * N / I = N + * I / n = I + * I / 0 = I + * I / N = N + * I / I = N + * + * Return a new BigNumber whose value is the value of this BigNumber divided by the value of + * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE. + */ + P.dividedBy = P.div = function ( y, b ) { + id = 3; + return div( this, new BigNumber( y, b ), DECIMAL_PLACES, ROUNDING_MODE ); + }; + + + /* + * Return a new BigNumber whose value is the integer part of dividing the value of this + * BigNumber by the value of BigNumber(y, b). + */ + P.dividedToIntegerBy = P.divToInt = function ( y, b ) { + id = 4; + return div( this, new BigNumber( y, b ), 0, 1 ); + }; + + + /* + * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b), + * otherwise returns false. + */ + P.equals = P.eq = function ( y, b ) { + id = 5; + return compare( this, new BigNumber( y, b ) ) === 0; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole + * number in the direction of -Infinity. + */ + P.floor = function () { + return round( new BigNumber(this), this.e + 1, 3 ); + }; + + + /* + * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b), + * otherwise returns false. + */ + P.greaterThan = P.gt = function ( y, b ) { + id = 6; + return compare( this, new BigNumber( y, b ) ) > 0; + }; + + + /* + * Return true if the value of this BigNumber is greater than or equal to the value of + * BigNumber(y, b), otherwise returns false. + */ + P.greaterThanOrEqualTo = P.gte = function ( y, b ) { + id = 7; + return ( b = compare( this, new BigNumber( y, b ) ) ) === 1 || b === 0; + + }; + + + /* + * Return true if the value of this BigNumber is a finite number, otherwise returns false. + */ + P.isFinite = function () { + return !!this.c; + }; + + + /* + * Return true if the value of this BigNumber is an integer, otherwise return false. + */ + P.isInteger = P.isInt = function () { + return !!this.c && bitFloor( this.e / LOG_BASE ) > this.c.length - 2; + }; + + + /* + * Return true if the value of this BigNumber is NaN, otherwise returns false. + */ + P.isNaN = function () { + return !this.s; + }; + + + /* + * Return true if the value of this BigNumber is negative, otherwise returns false. + */ + P.isNegative = P.isNeg = function () { + return this.s < 0; + }; + + + /* + * Return true if the value of this BigNumber is 0 or -0, otherwise returns false. + */ + P.isZero = function () { + return !!this.c && this.c[0] == 0; + }; + + + /* + * Return true if the value of this BigNumber is less than the value of BigNumber(y, b), + * otherwise returns false. + */ + P.lessThan = P.lt = function ( y, b ) { + id = 8; + return compare( this, new BigNumber( y, b ) ) < 0; + }; + + + /* + * Return true if the value of this BigNumber is less than or equal to the value of + * BigNumber(y, b), otherwise returns false. + */ + P.lessThanOrEqualTo = P.lte = function ( y, b ) { + id = 9; + return ( b = compare( this, new BigNumber( y, b ) ) ) === -1 || b === 0; + }; + + + /* + * n - 0 = n + * n - N = N + * n - I = -I + * 0 - n = -n + * 0 - 0 = 0 + * 0 - N = N + * 0 - I = -I + * N - n = N + * N - 0 = N + * N - N = N + * N - I = N + * I - n = I + * I - 0 = I + * I - N = N + * I - I = N + * + * Return a new BigNumber whose value is the value of this BigNumber minus the value of + * BigNumber(y, b). + */ + P.minus = P.sub = function ( y, b ) { + var i, j, t, xLTy, + x = this, + a = x.s; + + id = 10; + y = new BigNumber( y, b ); + b = y.s; + + // Either NaN? + if ( !a || !b ) return new BigNumber(NaN); + + // Signs differ? + if ( a != b ) { + y.s = -b; + return x.plus(y); + } + + var xe = x.e / LOG_BASE, + ye = y.e / LOG_BASE, + xc = x.c, + yc = y.c; + + if ( !xe || !ye ) { + + // Either Infinity? + if ( !xc || !yc ) return xc ? ( y.s = -b, y ) : new BigNumber( yc ? x : NaN ); + + // Either zero? + if ( !xc[0] || !yc[0] ) { + + // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. + return yc[0] ? ( y.s = -b, y ) : new BigNumber( xc[0] ? x : + + // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity + ROUNDING_MODE == 3 ? -0 : 0 ); + } + } + + xe = bitFloor(xe); + ye = bitFloor(ye); + xc = xc.slice(); + + // Determine which is the bigger number. + if ( a = xe - ye ) { + + if ( xLTy = a < 0 ) { + a = -a; + t = xc; + } else { + ye = xe; + t = yc; + } + + t.reverse(); + + // Prepend zeros to equalise exponents. + for ( b = a; b--; t.push(0) ); + t.reverse(); + } else { + + // Exponents equal. Check digit by digit. + j = ( xLTy = ( a = xc.length ) < ( b = yc.length ) ) ? a : b; + + for ( a = b = 0; b < j; b++ ) { + + if ( xc[b] != yc[b] ) { + xLTy = xc[b] < yc[b]; + break; + } + } + } + + // x < y? Point xc to the array of the bigger number. + if (xLTy) t = xc, xc = yc, yc = t, y.s = -y.s; + + b = ( j = yc.length ) - ( i = xc.length ); + + // Append zeros to xc if shorter. + // No need to add zeros to yc if shorter as subtract only needs to start at yc.length. + if ( b > 0 ) for ( ; b--; xc[i++] = 0 ); + b = BASE - 1; + + // Subtract yc from xc. + for ( ; j > a; ) { + + if ( xc[--j] < yc[j] ) { + for ( i = j; i && !xc[--i]; xc[i] = b ); + --xc[i]; + xc[j] += BASE; + } + + xc[j] -= yc[j]; + } + + // Remove leading zeros and adjust exponent accordingly. + for ( ; xc[0] == 0; xc.splice(0, 1), --ye ); + + // Zero? + if ( !xc[0] ) { + + // Following IEEE 754 (2008) 6.3, + // n - n = +0 but n - n = -0 when rounding towards -Infinity. + y.s = ROUNDING_MODE == 3 ? -1 : 1; + y.c = [ y.e = 0 ]; + return y; + } + + // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity + // for finite x and y. + return normalise( y, xc, ye ); + }; + + + /* + * n % 0 = N + * n % N = N + * n % I = n + * 0 % n = 0 + * -0 % n = -0 + * 0 % 0 = N + * 0 % N = N + * 0 % I = 0 + * N % n = N + * N % 0 = N + * N % N = N + * N % I = N + * I % n = N + * I % 0 = N + * I % N = N + * I % I = N + * + * Return a new BigNumber whose value is the value of this BigNumber modulo the value of + * BigNumber(y, b). The result depends on the value of MODULO_MODE. + */ + P.modulo = P.mod = function ( y, b ) { + var q, s, + x = this; + + id = 11; + y = new BigNumber( y, b ); + + // Return NaN if x is Infinity or NaN, or y is NaN or zero. + if ( !x.c || !y.s || y.c && !y.c[0] ) { + return new BigNumber(NaN); + + // Return x if y is Infinity or x is zero. + } else if ( !y.c || x.c && !x.c[0] ) { + return new BigNumber(x); + } + + if ( MODULO_MODE == 9 ) { + + // Euclidian division: q = sign(y) * floor(x / abs(y)) + // r = x - qy where 0 <= r < abs(y) + s = y.s; + y.s = 1; + q = div( x, y, 0, 3 ); + y.s = s; + q.s *= s; + } else { + q = div( x, y, 0, MODULO_MODE ); + } + + return x.minus( q.times(y) ); + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber negated, + * i.e. multiplied by -1. + */ + P.negated = P.neg = function () { + var x = new BigNumber(this); + x.s = -x.s || null; + return x; + }; + + + /* + * n + 0 = n + * n + N = N + * n + I = I + * 0 + n = n + * 0 + 0 = 0 + * 0 + N = N + * 0 + I = I + * N + n = N + * N + 0 = N + * N + N = N + * N + I = N + * I + n = I + * I + 0 = I + * I + N = N + * I + I = I + * + * Return a new BigNumber whose value is the value of this BigNumber plus the value of + * BigNumber(y, b). + */ + P.plus = P.add = function ( y, b ) { + var t, + x = this, + a = x.s; + + id = 12; + y = new BigNumber( y, b ); + b = y.s; + + // Either NaN? + if ( !a || !b ) return new BigNumber(NaN); + + // Signs differ? + if ( a != b ) { + y.s = -b; + return x.minus(y); + } + + var xe = x.e / LOG_BASE, + ye = y.e / LOG_BASE, + xc = x.c, + yc = y.c; + + if ( !xe || !ye ) { + + // Return ±Infinity if either ±Infinity. + if ( !xc || !yc ) return new BigNumber( a / 0 ); + + // Either zero? + // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. + if ( !xc[0] || !yc[0] ) return yc[0] ? y : new BigNumber( xc[0] ? x : a * 0 ); + } + + xe = bitFloor(xe); + ye = bitFloor(ye); + xc = xc.slice(); + + // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts. + if ( a = xe - ye ) { + if ( a > 0 ) { + ye = xe; + t = yc; + } else { + a = -a; + t = xc; + } + + t.reverse(); + for ( ; a--; t.push(0) ); + t.reverse(); + } + + a = xc.length; + b = yc.length; + + // Point xc to the longer array, and b to the shorter length. + if ( a - b < 0 ) t = yc, yc = xc, xc = t, b = a; + + // Only start adding at yc.length - 1 as the further digits of xc can be ignored. + for ( a = 0; b; ) { + a = ( xc[--b] = xc[b] + yc[b] + a ) / BASE | 0; + xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE; + } + + if (a) { + xc = [a].concat(xc); + ++ye; + } + + // No need to check for zero, as +x + +y != 0 && -x + -y != 0 + // ye = MAX_EXP + 1 possible + return normalise( y, xc, ye ); + }; + + + /* + * Return the number of significant digits of the value of this BigNumber. + * + * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0. + */ + P.precision = P.sd = function (z) { + var n, v, + x = this, + c = x.c; + + // 'precision() argument not a boolean or binary digit: {z}' + if ( z != null && z !== !!z && z !== 1 && z !== 0 ) { + if (ERRORS) raise( 13, 'argument' + notBool, z ); + if ( z != !!z ) z = null; + } + + if ( !c ) return null; + v = c.length - 1; + n = v * LOG_BASE + 1; + + if ( v = c[v] ) { + + // Subtract the number of trailing zeros of the last element. + for ( ; v % 10 == 0; v /= 10, n-- ); + + // Add the number of digits of the first element. + for ( v = c[0]; v >= 10; v /= 10, n++ ); + } + + if ( z && x.e + 1 > n ) n = x.e + 1; + + return n; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of + * dp decimal places using rounding mode rm, or to 0 and ROUNDING_MODE respectively if + * omitted. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'round() decimal places out of range: {dp}' + * 'round() decimal places not an integer: {dp}' + * 'round() rounding mode not an integer: {rm}' + * 'round() rounding mode out of range: {rm}' + */ + P.round = function ( dp, rm ) { + var n = new BigNumber(this); + + if ( dp == null || isValidInt( dp, 0, MAX, 15 ) ) { + round( n, ~~dp + this.e + 1, rm == null || + !isValidInt( rm, 0, 8, 15, roundingMode ) ? ROUNDING_MODE : rm | 0 ); + } + + return n; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber shifted by k places + * (powers of 10). Shift to the right if n > 0, and to the left if n < 0. + * + * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive. + * + * If k is out of range and ERRORS is false, the result will be ±0 if k < 0, or ±Infinity + * otherwise. + * + * 'shift() argument not an integer: {k}' + * 'shift() argument out of range: {k}' + */ + P.shift = function (k) { + var n = this; + return isValidInt( k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 16, 'argument' ) + + // k < 1e+21, or truncate(k) will produce exponential notation. + ? n.times( '1e' + truncate(k) ) + : new BigNumber( n.c && n.c[0] && ( k < -MAX_SAFE_INTEGER || k > MAX_SAFE_INTEGER ) + ? n.s * ( k < 0 ? 0 : 1 / 0 ) + : n ); + }; + + + /* + * sqrt(-n) = N + * sqrt( N) = N + * sqrt(-I) = N + * sqrt( I) = I + * sqrt( 0) = 0 + * sqrt(-0) = -0 + * + * Return a new BigNumber whose value is the square root of the value of this BigNumber, + * rounded according to DECIMAL_PLACES and ROUNDING_MODE. + */ + P.squareRoot = P.sqrt = function () { + var m, n, r, rep, t, + x = this, + c = x.c, + s = x.s, + e = x.e, + dp = DECIMAL_PLACES + 4, + half = new BigNumber('0.5'); + + // Negative/NaN/Infinity/zero? + if ( s !== 1 || !c || !c[0] ) { + return new BigNumber( !s || s < 0 && ( !c || c[0] ) ? NaN : c ? x : 1 / 0 ); + } + + // Initial estimate. + s = Math.sqrt( +x ); + + // Math.sqrt underflow/overflow? + // Pass x to Math.sqrt as integer, then adjust the exponent of the result. + if ( s == 0 || s == 1 / 0 ) { + n = coeffToString(c); + if ( ( n.length + e ) % 2 == 0 ) n += '0'; + s = Math.sqrt(n); + e = bitFloor( ( e + 1 ) / 2 ) - ( e < 0 || e % 2 ); + + if ( s == 1 / 0 ) { + n = '1e' + e; + } else { + n = s.toExponential(); + n = n.slice( 0, n.indexOf('e') + 1 ) + e; + } + + r = new BigNumber(n); + } else { + r = new BigNumber( s + '' ); + } + + // Check for zero. + // r could be zero if MIN_EXP is changed after the this value was created. + // This would cause a division by zero (x/t) and hence Infinity below, which would cause + // coeffToString to throw. + if ( r.c[0] ) { + e = r.e; + s = e + dp; + if ( s < 3 ) s = 0; + + // Newton-Raphson iteration. + for ( ; ; ) { + t = r; + r = half.times( t.plus( div( x, t, dp, 1 ) ) ); + + if ( coeffToString( t.c ).slice( 0, s ) === ( n = + coeffToString( r.c ) ).slice( 0, s ) ) { + + // The exponent of r may here be one less than the final result exponent, + // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits + // are indexed correctly. + if ( r.e < e ) --s; + n = n.slice( s - 3, s + 1 ); + + // The 4th rounding digit may be in error by -1 so if the 4 rounding digits + // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the + // iteration. + if ( n == '9999' || !rep && n == '4999' ) { + + // On the first iteration only, check to see if rounding up gives the + // exact result as the nines may infinitely repeat. + if ( !rep ) { + round( t, t.e + DECIMAL_PLACES + 2, 0 ); + + if ( t.times(t).eq(x) ) { + r = t; + break; + } + } + + dp += 4; + s += 4; + rep = 1; + } else { + + // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact + // result. If not, then there are further digits and m will be truthy. + if ( !+n || !+n.slice(1) && n.charAt(0) == '5' ) { + + // Truncate to the first rounding digit. + round( r, r.e + DECIMAL_PLACES + 2, 1 ); + m = !r.times(r).eq(x); + } + + break; + } + } + } + } + + return round( r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m ); + }; + + + /* + * n * 0 = 0 + * n * N = N + * n * I = I + * 0 * n = 0 + * 0 * 0 = 0 + * 0 * N = N + * 0 * I = N + * N * n = N + * N * 0 = N + * N * N = N + * N * I = N + * I * n = I + * I * 0 = N + * I * N = N + * I * I = I + * + * Return a new BigNumber whose value is the value of this BigNumber times the value of + * BigNumber(y, b). + */ + P.times = P.mul = function ( y, b ) { + var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc, + base, sqrtBase, + x = this, + xc = x.c, + yc = ( id = 17, y = new BigNumber( y, b ) ).c; + + // Either NaN, ±Infinity or ±0? + if ( !xc || !yc || !xc[0] || !yc[0] ) { + + // Return NaN if either is NaN, or one is 0 and the other is Infinity. + if ( !x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc ) { + y.c = y.e = y.s = null; + } else { + y.s *= x.s; + + // Return ±Infinity if either is ±Infinity. + if ( !xc || !yc ) { + y.c = y.e = null; + + // Return ±0 if either is ±0. + } else { + y.c = [0]; + y.e = 0; + } + } + + return y; + } + + e = bitFloor( x.e / LOG_BASE ) + bitFloor( y.e / LOG_BASE ); + y.s *= x.s; + xcL = xc.length; + ycL = yc.length; + + // Ensure xc points to longer array and xcL to its length. + if ( xcL < ycL ) zc = xc, xc = yc, yc = zc, i = xcL, xcL = ycL, ycL = i; + + // Initialise the result array with zeros. + for ( i = xcL + ycL, zc = []; i--; zc.push(0) ); + + base = BASE; + sqrtBase = SQRT_BASE; + + for ( i = ycL; --i >= 0; ) { + c = 0; + ylo = yc[i] % sqrtBase; + yhi = yc[i] / sqrtBase | 0; + + for ( k = xcL, j = i + k; j > i; ) { + xlo = xc[--k] % sqrtBase; + xhi = xc[k] / sqrtBase | 0; + m = yhi * xlo + xhi * ylo; + xlo = ylo * xlo + ( ( m % sqrtBase ) * sqrtBase ) + zc[j] + c; + c = ( xlo / base | 0 ) + ( m / sqrtBase | 0 ) + yhi * xhi; + zc[j--] = xlo % base; + } + + zc[j] = c; + } + + if (c) { + ++e; + } else { + zc.splice(0, 1); + } + + return normalise( y, zc, e ); + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of + * sd significant digits using rounding mode rm, or ROUNDING_MODE if rm is omitted. + * + * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toDigits() precision out of range: {sd}' + * 'toDigits() precision not an integer: {sd}' + * 'toDigits() rounding mode not an integer: {rm}' + * 'toDigits() rounding mode out of range: {rm}' + */ + P.toDigits = function ( sd, rm ) { + var n = new BigNumber(this); + sd = sd == null || !isValidInt( sd, 1, MAX, 18, 'precision' ) ? null : sd | 0; + rm = rm == null || !isValidInt( rm, 0, 8, 18, roundingMode ) ? ROUNDING_MODE : rm | 0; + return sd ? round( n, sd, rm ) : n; + }; + + + /* + * Return a string representing the value of this BigNumber in exponential notation and + * rounded using ROUNDING_MODE to dp fixed decimal places. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toExponential() decimal places not an integer: {dp}' + * 'toExponential() decimal places out of range: {dp}' + * 'toExponential() rounding mode not an integer: {rm}' + * 'toExponential() rounding mode out of range: {rm}' + */ + P.toExponential = function ( dp, rm ) { + return format( this, + dp != null && isValidInt( dp, 0, MAX, 19 ) ? ~~dp + 1 : null, rm, 19 ); + }; + + + /* + * Return a string representing the value of this BigNumber in fixed-point notation rounding + * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted. + * + * Note: as with JavaScript's number type, (-0).toFixed(0) is '0', + * but e.g. (-0.00001).toFixed(0) is '-0'. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toFixed() decimal places not an integer: {dp}' + * 'toFixed() decimal places out of range: {dp}' + * 'toFixed() rounding mode not an integer: {rm}' + * 'toFixed() rounding mode out of range: {rm}' + */ + P.toFixed = function ( dp, rm ) { + return format( this, dp != null && isValidInt( dp, 0, MAX, 20 ) + ? ~~dp + this.e + 1 : null, rm, 20 ); + }; + + + /* + * Return a string representing the value of this BigNumber in fixed-point notation rounded + * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties + * of the FORMAT object (see BigNumber.config). + * + * FORMAT = { + * decimalSeparator : '.', + * groupSeparator : ',', + * groupSize : 3, + * secondaryGroupSize : 0, + * fractionGroupSeparator : '\xA0', // non-breaking space + * fractionGroupSize : 0 + * }; + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toFormat() decimal places not an integer: {dp}' + * 'toFormat() decimal places out of range: {dp}' + * 'toFormat() rounding mode not an integer: {rm}' + * 'toFormat() rounding mode out of range: {rm}' + */ + P.toFormat = function ( dp, rm ) { + var str = format( this, dp != null && isValidInt( dp, 0, MAX, 21 ) + ? ~~dp + this.e + 1 : null, rm, 21 ); + + if ( this.c ) { + var i, + arr = str.split('.'), + g1 = +FORMAT.groupSize, + g2 = +FORMAT.secondaryGroupSize, + groupSeparator = FORMAT.groupSeparator, + intPart = arr[0], + fractionPart = arr[1], + isNeg = this.s < 0, + intDigits = isNeg ? intPart.slice(1) : intPart, + len = intDigits.length; + + if (g2) i = g1, g1 = g2, g2 = i, len -= i; + + if ( g1 > 0 && len > 0 ) { + i = len % g1 || g1; + intPart = intDigits.substr( 0, i ); + + for ( ; i < len; i += g1 ) { + intPart += groupSeparator + intDigits.substr( i, g1 ); + } + + if ( g2 > 0 ) intPart += groupSeparator + intDigits.slice(i); + if (isNeg) intPart = '-' + intPart; + } + + str = fractionPart + ? intPart + FORMAT.decimalSeparator + ( ( g2 = +FORMAT.fractionGroupSize ) + ? fractionPart.replace( new RegExp( '\\d{' + g2 + '}\\B', 'g' ), + '$&' + FORMAT.fractionGroupSeparator ) + : fractionPart ) + : intPart; + } + + return str; + }; + + + /* + * Return a string array representing the value of this BigNumber as a simple fraction with + * an integer numerator and an integer denominator. The denominator will be a positive + * non-zero value less than or equal to the specified maximum denominator. If a maximum + * denominator is not specified, the denominator will be the lowest value necessary to + * represent the number exactly. + * + * [md] {number|string|BigNumber} Integer >= 1 and < Infinity. The maximum denominator. + * + * 'toFraction() max denominator not an integer: {md}' + * 'toFraction() max denominator out of range: {md}' + */ + P.toFraction = function (md) { + var arr, d0, d2, e, exp, n, n0, q, s, + k = ERRORS, + x = this, + xc = x.c, + d = new BigNumber(ONE), + n1 = d0 = new BigNumber(ONE), + d1 = n0 = new BigNumber(ONE); + + if ( md != null ) { + ERRORS = false; + n = new BigNumber(md); + ERRORS = k; + + if ( !( k = n.isInt() ) || n.lt(ONE) ) { + + if (ERRORS) { + raise( 22, + 'max denominator ' + ( k ? 'out of range' : 'not an integer' ), md ); + } + + // ERRORS is false: + // If md is a finite non-integer >= 1, round it to an integer and use it. + md = !k && n.c && round( n, n.e + 1, 1 ).gte(ONE) ? n : null; + } + } + + if ( !xc ) return x.toString(); + s = coeffToString(xc); + + // Determine initial denominator. + // d is a power of 10 and the minimum max denominator that specifies the value exactly. + e = d.e = s.length - x.e - 1; + d.c[0] = POWS_TEN[ ( exp = e % LOG_BASE ) < 0 ? LOG_BASE + exp : exp ]; + md = !md || n.cmp(d) > 0 ? ( e > 0 ? d : n1 ) : n; + + exp = MAX_EXP; + MAX_EXP = 1 / 0; + n = new BigNumber(s); + + // n0 = d1 = 0 + n0.c[0] = 0; + + for ( ; ; ) { + q = div( n, d, 0, 1 ); + d2 = d0.plus( q.times(d1) ); + if ( d2.cmp(md) == 1 ) break; + d0 = d1; + d1 = d2; + n1 = n0.plus( q.times( d2 = n1 ) ); + n0 = d2; + d = n.minus( q.times( d2 = d ) ); + n = d2; + } + + d2 = div( md.minus(d0), d1, 0, 1 ); + n0 = n0.plus( d2.times(n1) ); + d0 = d0.plus( d2.times(d1) ); + n0.s = n1.s = x.s; + e *= 2; + + // Determine which fraction is closer to x, n0/d0 or n1/d1 + arr = div( n1, d1, e, ROUNDING_MODE ).minus(x).abs().cmp( + div( n0, d0, e, ROUNDING_MODE ).minus(x).abs() ) < 1 + ? [ n1.toString(), d1.toString() ] + : [ n0.toString(), d0.toString() ]; + + MAX_EXP = exp; + return arr; + }; + + + /* + * Return the value of this BigNumber converted to a number primitive. + */ + P.toNumber = function () { + return +this; + }; + + + /* + * Return a BigNumber whose value is the value of this BigNumber raised to the power n. + * If m is present, return the result modulo m. + * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE. + * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using + * ROUNDING_MODE. + * + * The modular power operation works efficiently when x, n, and m are positive integers, + * otherwise it is equivalent to calculating x.toPower(n).modulo(m) (with POW_PRECISION 0). + * + * n {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive. + * [m] {number|string|BigNumber} The modulus. + * + * 'pow() exponent not an integer: {n}' + * 'pow() exponent out of range: {n}' + * + * Performs 54 loop iterations for n of 9007199254740991. + */ + P.toPower = P.pow = function ( n, m ) { + var k, y, z, + i = mathfloor( n < 0 ? -n : +n ), + x = this; + + if ( m != null ) { + id = 23; + m = new BigNumber(m); + } + + // Pass ±Infinity to Math.pow if exponent is out of range. + if ( !isValidInt( n, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 23, 'exponent' ) && + ( !isFinite(n) || i > MAX_SAFE_INTEGER && ( n /= 0 ) || + parseFloat(n) != n && !( n = NaN ) ) || n == 0 ) { + k = Math.pow( +x, n ); + return new BigNumber( m ? k % m : k ); + } + + if (m) { + if ( n > 1 && x.gt(ONE) && x.isInt() && m.gt(ONE) && m.isInt() ) { + x = x.mod(m); + } else { + z = m; + + // Nullify m so only a single mod operation is performed at the end. + m = null; + } + } else if (POW_PRECISION) { + + // Truncating each coefficient array to a length of k after each multiplication + // equates to truncating significant digits to POW_PRECISION + [28, 41], + // i.e. there will be a minimum of 28 guard digits retained. + // (Using + 1.5 would give [9, 21] guard digits.) + k = mathceil( POW_PRECISION / LOG_BASE + 2 ); + } + + y = new BigNumber(ONE); + + for ( ; ; ) { + if ( i % 2 ) { + y = y.times(x); + if ( !y.c ) break; + if (k) { + if ( y.c.length > k ) y.c.length = k; + } else if (m) { + y = y.mod(m); + } + } + + i = mathfloor( i / 2 ); + if ( !i ) break; + x = x.times(x); + if (k) { + if ( x.c && x.c.length > k ) x.c.length = k; + } else if (m) { + x = x.mod(m); + } + } + + if (m) return y; + if ( n < 0 ) y = ONE.div(y); + + return z ? y.mod(z) : k ? round( y, POW_PRECISION, ROUNDING_MODE ) : y; + }; + + + /* + * Return a string representing the value of this BigNumber rounded to sd significant digits + * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits + * necessary to represent the integer part of the value in fixed-point notation, then use + * exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toPrecision() precision not an integer: {sd}' + * 'toPrecision() precision out of range: {sd}' + * 'toPrecision() rounding mode not an integer: {rm}' + * 'toPrecision() rounding mode out of range: {rm}' + */ + P.toPrecision = function ( sd, rm ) { + return format( this, sd != null && isValidInt( sd, 1, MAX, 24, 'precision' ) + ? sd | 0 : null, rm, 24 ); + }; + + + /* + * Return a string representing the value of this BigNumber in base b, or base 10 if b is + * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and + * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent + * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than + * TO_EXP_NEG, return exponential notation. + * + * [b] {number} Integer, 2 to 64 inclusive. + * + * 'toString() base not an integer: {b}' + * 'toString() base out of range: {b}' + */ + P.toString = function (b) { + var str, + n = this, + s = n.s, + e = n.e; + + // Infinity or NaN? + if ( e === null ) { + + if (s) { + str = 'Infinity'; + if ( s < 0 ) str = '-' + str; + } else { + str = 'NaN'; + } + } else { + str = coeffToString( n.c ); + + if ( b == null || !isValidInt( b, 2, 64, 25, 'base' ) ) { + str = e <= TO_EXP_NEG || e >= TO_EXP_POS + ? toExponential( str, e ) + : toFixedPoint( str, e ); + } else { + str = convertBase( toFixedPoint( str, e ), b | 0, 10, s ); + } + + if ( s < 0 && n.c[0] ) str = '-' + str; + } + + return str; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber truncated to a whole + * number. + */ + P.truncated = P.trunc = function () { + return round( new BigNumber(this), this.e + 1, 1 ); + }; + + + /* + * Return as toString, but do not accept a base argument, and include the minus sign for + * negative zero. + */ + P.valueOf = P.toJSON = function () { + var str, + n = this, + e = n.e; + + if ( e === null ) return n.toString(); + + str = coeffToString( n.c ); + + str = e <= TO_EXP_NEG || e >= TO_EXP_POS + ? toExponential( str, e ) + : toFixedPoint( str, e ); + + return n.s < 0 ? '-' + str : str; + }; + + + P.isBigNumber = true; + + if ( config != null ) BigNumber.config(config); + + return BigNumber; + } + + + // PRIVATE HELPER FUNCTIONS + + + function bitFloor(n) { + var i = n | 0; + return n > 0 || n === i ? i : i - 1; + } + + + // Return a coefficient array as a string of base 10 digits. + function coeffToString(a) { + var s, z, + i = 1, + j = a.length, + r = a[0] + ''; + + for ( ; i < j; ) { + s = a[i++] + ''; + z = LOG_BASE - s.length; + for ( ; z--; s = '0' + s ); + r += s; + } + + // Determine trailing zeros. + for ( j = r.length; r.charCodeAt(--j) === 48; ); + return r.slice( 0, j + 1 || 1 ); + } + + + // Compare the value of BigNumbers x and y. + function compare( x, y ) { + var a, b, + xc = x.c, + yc = y.c, + i = x.s, + j = y.s, + k = x.e, + l = y.e; + + // Either NaN? + if ( !i || !j ) return null; + + a = xc && !xc[0]; + b = yc && !yc[0]; + + // Either zero? + if ( a || b ) return a ? b ? 0 : -j : i; + + // Signs differ? + if ( i != j ) return i; + + a = i < 0; + b = k == l; + + // Either Infinity? + if ( !xc || !yc ) return b ? 0 : !xc ^ a ? 1 : -1; + + // Compare exponents. + if ( !b ) return k > l ^ a ? 1 : -1; + + j = ( k = xc.length ) < ( l = yc.length ) ? k : l; + + // Compare digit by digit. + for ( i = 0; i < j; i++ ) if ( xc[i] != yc[i] ) return xc[i] > yc[i] ^ a ? 1 : -1; + + // Compare lengths. + return k == l ? 0 : k > l ^ a ? 1 : -1; + } + + + /* + * Return true if n is a valid number in range, otherwise false. + * Use for argument validation when ERRORS is false. + * Note: parseInt('1e+1') == 1 but parseFloat('1e+1') == 10. + */ + function intValidatorNoErrors( n, min, max ) { + return ( n = truncate(n) ) >= min && n <= max; + } + + + function isArray(obj) { + return Object.prototype.toString.call(obj) == '[object Array]'; + } + + + /* + * Convert string of baseIn to an array of numbers of baseOut. + * Eg. convertBase('255', 10, 16) returns [15, 15]. + * Eg. convertBase('ff', 16, 10) returns [2, 5, 5]. + */ + function toBaseOut( str, baseIn, baseOut ) { + var j, + arr = [0], + arrL, + i = 0, + len = str.length; + + for ( ; i < len; ) { + for ( arrL = arr.length; arrL--; arr[arrL] *= baseIn ); + arr[ j = 0 ] += ALPHABET.indexOf( str.charAt( i++ ) ); + + for ( ; j < arr.length; j++ ) { + + if ( arr[j] > baseOut - 1 ) { + if ( arr[j + 1] == null ) arr[j + 1] = 0; + arr[j + 1] += arr[j] / baseOut | 0; + arr[j] %= baseOut; + } + } + } + + return arr.reverse(); + } + + + function toExponential( str, e ) { + return ( str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str ) + + ( e < 0 ? 'e' : 'e+' ) + e; + } + + + function toFixedPoint( str, e ) { + var len, z; + + // Negative exponent? + if ( e < 0 ) { + + // Prepend zeros. + for ( z = '0.'; ++e; z += '0' ); + str = z + str; + + // Positive exponent + } else { + len = str.length; + + // Append zeros. + if ( ++e > len ) { + for ( z = '0', e -= len; --e; z += '0' ); + str += z; + } else if ( e < len ) { + str = str.slice( 0, e ) + '.' + str.slice(e); + } + } + + return str; + } + + + function truncate(n) { + n = parseFloat(n); + return n < 0 ? mathceil(n) : mathfloor(n); + } + + + // EXPORT + + + BigNumber = constructorFactory(); + BigNumber['default'] = BigNumber.BigNumber = BigNumber; + + + // AMD. + if ( true ) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () { return BigNumber; }).call(exports, __webpack_require__, exports, module), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + + // Node.js and other environments that support module.exports. + } else {} +})(this); + + +/***/ }), +/* 39 */ +/***/ (function(module, exports) { + +module.exports = require("buffer"); + +/***/ }), +/* 40 */ +/***/ (function(module, exports) { + + +module.exports = BufferList; +function BufferList() { + this.bufs = []; + this.size = 0; +} + +BufferList.prototype.shift = function shift() { + var buf = this.bufs.shift(); + + if (buf) { + this.size -= buf.length; + } + + return buf; +}; + +BufferList.prototype.push = function push(buf) { + if (!buf || !buf.length) { + return; + } + + this.bufs.push(buf); + this.size += buf.length; +}; + + +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { + +exports.ChangeUser = __webpack_require__(42); +exports.Handshake = __webpack_require__(67); +exports.Ping = __webpack_require__(68); +exports.Query = __webpack_require__(19); +exports.Quit = __webpack_require__(78); +exports.Sequence = __webpack_require__(3); +exports.Statistics = __webpack_require__(79); + + +/***/ }), +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { + +var Sequence = __webpack_require__(3); +var Util = __webpack_require__(0); +var Packets = __webpack_require__(2); +var Auth = __webpack_require__(18); + +module.exports = ChangeUser; +Util.inherits(ChangeUser, Sequence); +function ChangeUser(options, callback) { + Sequence.call(this, options, callback); + + this._user = options.user; + this._password = options.password; + this._database = options.database; + this._charsetNumber = options.charsetNumber; + this._currentConfig = options.currentConfig; +} + +ChangeUser.prototype.start = function(handshakeInitializationPacket) { + var scrambleBuff = handshakeInitializationPacket.scrambleBuff(); + scrambleBuff = Auth.token(this._password, scrambleBuff); + + var packet = new Packets.ComChangeUserPacket({ + user : this._user, + scrambleBuff : scrambleBuff, + database : this._database, + charsetNumber : this._charsetNumber + }); + + this._currentConfig.user = this._user; + this._currentConfig.password = this._password; + this._currentConfig.database = this._database; + this._currentConfig.charsetNumber = this._charsetNumber; + + this.emit('packet', packet); +}; + +ChangeUser.prototype['ErrorPacket'] = function(packet) { + var err = this._packetToError(packet); + err.fatal = true; + this.end(err); +}; + + +/***/ }), +/* 43 */ +/***/ (function(module, exports) { + +module.exports = AuthSwitchRequestPacket; +function AuthSwitchRequestPacket(options) { + options = options || {}; + + this.status = 0xfe; + this.authMethodName = options.authMethodName; + this.authMethodData = options.authMethodData; +} + +AuthSwitchRequestPacket.prototype.parse = function parse(parser) { + this.status = parser.parseUnsignedNumber(1); + this.authMethodName = parser.parseNullTerminatedString(); + this.authMethodData = parser.parsePacketTerminatedBuffer(); +}; + +AuthSwitchRequestPacket.prototype.write = function write(writer) { + writer.writeUnsignedNumber(1, this.status); + writer.writeNullTerminatedString(this.authMethodName); + writer.writeBuffer(this.authMethodData); +}; + + +/***/ }), +/* 44 */ +/***/ (function(module, exports) { + +module.exports = AuthSwitchResponsePacket; +function AuthSwitchResponsePacket(options) { + options = options || {}; + + this.data = options.data; +} + +AuthSwitchResponsePacket.prototype.parse = function parse(parser) { + this.data = parser.parsePacketTerminatedBuffer(); +}; + +AuthSwitchResponsePacket.prototype.write = function write(writer) { + writer.writeBuffer(this.data); +}; + + +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { + +var Buffer = __webpack_require__(1).Buffer; + +module.exports = ClientAuthenticationPacket; +function ClientAuthenticationPacket(options) { + options = options || {}; + + this.clientFlags = options.clientFlags; + this.maxPacketSize = options.maxPacketSize; + this.charsetNumber = options.charsetNumber; + this.filler = undefined; + this.user = options.user; + this.scrambleBuff = options.scrambleBuff; + this.database = options.database; + this.protocol41 = options.protocol41; +} + +ClientAuthenticationPacket.prototype.parse = function(parser) { + if (this.protocol41) { + this.clientFlags = parser.parseUnsignedNumber(4); + this.maxPacketSize = parser.parseUnsignedNumber(4); + this.charsetNumber = parser.parseUnsignedNumber(1); + this.filler = parser.parseFiller(23); + this.user = parser.parseNullTerminatedString(); + this.scrambleBuff = parser.parseLengthCodedBuffer(); + this.database = parser.parseNullTerminatedString(); + } else { + this.clientFlags = parser.parseUnsignedNumber(2); + this.maxPacketSize = parser.parseUnsignedNumber(3); + this.user = parser.parseNullTerminatedString(); + this.scrambleBuff = parser.parseBuffer(8); + this.database = parser.parseLengthCodedBuffer(); + } +}; + +ClientAuthenticationPacket.prototype.write = function(writer) { + if (this.protocol41) { + writer.writeUnsignedNumber(4, this.clientFlags); + writer.writeUnsignedNumber(4, this.maxPacketSize); + writer.writeUnsignedNumber(1, this.charsetNumber); + writer.writeFiller(23); + writer.writeNullTerminatedString(this.user); + writer.writeLengthCodedBuffer(this.scrambleBuff); + writer.writeNullTerminatedString(this.database); + } else { + writer.writeUnsignedNumber(2, this.clientFlags); + writer.writeUnsignedNumber(3, this.maxPacketSize); + writer.writeNullTerminatedString(this.user); + writer.writeBuffer(this.scrambleBuff); + if (this.database && this.database.length) { + writer.writeFiller(1); + writer.writeBuffer(Buffer.from(this.database)); + } + } +}; + + +/***/ }), +/* 46 */ +/***/ (function(module, exports) { + +module.exports = ComChangeUserPacket; +function ComChangeUserPacket(options) { + options = options || {}; + + this.command = 0x11; + this.user = options.user; + this.scrambleBuff = options.scrambleBuff; + this.database = options.database; + this.charsetNumber = options.charsetNumber; +} + +ComChangeUserPacket.prototype.parse = function(parser) { + this.command = parser.parseUnsignedNumber(1); + this.user = parser.parseNullTerminatedString(); + this.scrambleBuff = parser.parseLengthCodedBuffer(); + this.database = parser.parseNullTerminatedString(); + this.charsetNumber = parser.parseUnsignedNumber(1); +}; + +ComChangeUserPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.command); + writer.writeNullTerminatedString(this.user); + writer.writeLengthCodedBuffer(this.scrambleBuff); + writer.writeNullTerminatedString(this.database); + writer.writeUnsignedNumber(2, this.charsetNumber); +}; + + +/***/ }), +/* 47 */ +/***/ (function(module, exports) { + +module.exports = ComPingPacket; +function ComPingPacket() { + this.command = 0x0e; +} + +ComPingPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.command); +}; + +ComPingPacket.prototype.parse = function(parser) { + this.command = parser.parseUnsignedNumber(1); +}; + + +/***/ }), +/* 48 */ +/***/ (function(module, exports) { + +module.exports = ComQueryPacket; +function ComQueryPacket(sql) { + this.command = 0x03; + this.sql = sql; +} + +ComQueryPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.command); + writer.writeString(this.sql); +}; + +ComQueryPacket.prototype.parse = function(parser) { + this.command = parser.parseUnsignedNumber(1); + this.sql = parser.parsePacketTerminatedString(); +}; + + +/***/ }), +/* 49 */ +/***/ (function(module, exports) { + +module.exports = ComQuitPacket; +function ComQuitPacket() { + this.command = 0x01; +} + +ComQuitPacket.prototype.parse = function parse(parser) { + this.command = parser.parseUnsignedNumber(1); +}; + +ComQuitPacket.prototype.write = function write(writer) { + writer.writeUnsignedNumber(1, this.command); +}; + + +/***/ }), +/* 50 */ +/***/ (function(module, exports) { + +module.exports = ComStatisticsPacket; +function ComStatisticsPacket() { + this.command = 0x09; +} + +ComStatisticsPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.command); +}; + +ComStatisticsPacket.prototype.parse = function(parser) { + this.command = parser.parseUnsignedNumber(1); +}; + + +/***/ }), +/* 51 */ +/***/ (function(module, exports) { + +module.exports = EmptyPacket; +function EmptyPacket() { +} + +EmptyPacket.prototype.write = function write() { +}; + + +/***/ }), +/* 52 */ +/***/ (function(module, exports) { + +module.exports = EofPacket; +function EofPacket(options) { + options = options || {}; + + this.fieldCount = undefined; + this.warningCount = options.warningCount; + this.serverStatus = options.serverStatus; + this.protocol41 = options.protocol41; +} + +EofPacket.prototype.parse = function(parser) { + this.fieldCount = parser.parseUnsignedNumber(1); + if (this.protocol41) { + this.warningCount = parser.parseUnsignedNumber(2); + this.serverStatus = parser.parseUnsignedNumber(2); + } +}; + +EofPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, 0xfe); + if (this.protocol41) { + writer.writeUnsignedNumber(2, this.warningCount); + writer.writeUnsignedNumber(2, this.serverStatus); + } +}; + + +/***/ }), +/* 53 */ +/***/ (function(module, exports) { + +module.exports = ErrorPacket; +function ErrorPacket(options) { + options = options || {}; + + this.fieldCount = options.fieldCount; + this.errno = options.errno; + this.sqlStateMarker = options.sqlStateMarker; + this.sqlState = options.sqlState; + this.message = options.message; +} + +ErrorPacket.prototype.parse = function(parser) { + this.fieldCount = parser.parseUnsignedNumber(1); + this.errno = parser.parseUnsignedNumber(2); + + // sqlStateMarker ('#' = 0x23) indicates error packet format + if (parser.peak() === 0x23) { + this.sqlStateMarker = parser.parseString(1); + this.sqlState = parser.parseString(5); + } + + this.message = parser.parsePacketTerminatedString(); +}; + +ErrorPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, 0xff); + writer.writeUnsignedNumber(2, this.errno); + + if (this.sqlStateMarker) { + writer.writeString(this.sqlStateMarker); + writer.writeString(this.sqlState); + } + + writer.writeString(this.message); +}; + + +/***/ }), +/* 54 */ +/***/ (function(module, exports) { + +module.exports = FieldPacket; +function FieldPacket(options) { + options = options || {}; + + this.catalog = options.catalog; + this.db = options.db; + this.table = options.table; + this.orgTable = options.orgTable; + this.name = options.name; + this.orgName = options.orgName; + this.charsetNr = options.charsetNr; + this.length = options.length; + this.type = options.type; + this.flags = options.flags; + this.decimals = options.decimals; + this.default = options.default; + this.zeroFill = options.zeroFill; + this.protocol41 = options.protocol41; +} + +FieldPacket.prototype.parse = function(parser) { + if (this.protocol41) { + this.catalog = parser.parseLengthCodedString(); + this.db = parser.parseLengthCodedString(); + this.table = parser.parseLengthCodedString(); + this.orgTable = parser.parseLengthCodedString(); + this.name = parser.parseLengthCodedString(); + this.orgName = parser.parseLengthCodedString(); + + if (parser.parseLengthCodedNumber() !== 0x0c) { + var err = new TypeError('Received invalid field length'); + err.code = 'PARSER_INVALID_FIELD_LENGTH'; + throw err; + } + + this.charsetNr = parser.parseUnsignedNumber(2); + this.length = parser.parseUnsignedNumber(4); + this.type = parser.parseUnsignedNumber(1); + this.flags = parser.parseUnsignedNumber(2); + this.decimals = parser.parseUnsignedNumber(1); + + var filler = parser.parseBuffer(2); + if (filler[0] !== 0x0 || filler[1] !== 0x0) { + var err = new TypeError('Received invalid filler'); + err.code = 'PARSER_INVALID_FILLER'; + throw err; + } + + // parsed flags + this.zeroFill = (this.flags & 0x0040 ? true : false); + + if (parser.reachedPacketEnd()) { + return; + } + + this.default = parser.parseLengthCodedString(); + } else { + this.table = parser.parseLengthCodedString(); + this.name = parser.parseLengthCodedString(); + this.length = parser.parseUnsignedNumber(parser.parseUnsignedNumber(1)); + this.type = parser.parseUnsignedNumber(parser.parseUnsignedNumber(1)); + } +}; + +FieldPacket.prototype.write = function(writer) { + if (this.protocol41) { + writer.writeLengthCodedString(this.catalog); + writer.writeLengthCodedString(this.db); + writer.writeLengthCodedString(this.table); + writer.writeLengthCodedString(this.orgTable); + writer.writeLengthCodedString(this.name); + writer.writeLengthCodedString(this.orgName); + + writer.writeLengthCodedNumber(0x0c); + writer.writeUnsignedNumber(2, this.charsetNr || 0); + writer.writeUnsignedNumber(4, this.length || 0); + writer.writeUnsignedNumber(1, this.type || 0); + writer.writeUnsignedNumber(2, this.flags || 0); + writer.writeUnsignedNumber(1, this.decimals || 0); + writer.writeFiller(2); + + if (this.default !== undefined) { + writer.writeLengthCodedString(this.default); + } + } else { + writer.writeLengthCodedString(this.table); + writer.writeLengthCodedString(this.name); + writer.writeUnsignedNumber(1, 0x01); + writer.writeUnsignedNumber(1, this.length); + writer.writeUnsignedNumber(1, 0x01); + writer.writeUnsignedNumber(1, this.type); + } +}; + + +/***/ }), +/* 55 */ +/***/ (function(module, exports, __webpack_require__) { + +var Buffer = __webpack_require__(1).Buffer; +var Client = __webpack_require__(9); + +module.exports = HandshakeInitializationPacket; +function HandshakeInitializationPacket(options) { + options = options || {}; + + this.protocolVersion = options.protocolVersion; + this.serverVersion = options.serverVersion; + this.threadId = options.threadId; + this.scrambleBuff1 = options.scrambleBuff1; + this.filler1 = options.filler1; + this.serverCapabilities1 = options.serverCapabilities1; + this.serverLanguage = options.serverLanguage; + this.serverStatus = options.serverStatus; + this.serverCapabilities2 = options.serverCapabilities2; + this.scrambleLength = options.scrambleLength; + this.filler2 = options.filler2; + this.scrambleBuff2 = options.scrambleBuff2; + this.filler3 = options.filler3; + this.pluginData = options.pluginData; + this.protocol41 = options.protocol41; + + if (this.protocol41) { + // force set the bit in serverCapabilities1 + this.serverCapabilities1 |= Client.CLIENT_PROTOCOL_41; + } +} + +HandshakeInitializationPacket.prototype.parse = function(parser) { + this.protocolVersion = parser.parseUnsignedNumber(1); + this.serverVersion = parser.parseNullTerminatedString(); + this.threadId = parser.parseUnsignedNumber(4); + this.scrambleBuff1 = parser.parseBuffer(8); + this.filler1 = parser.parseFiller(1); + this.serverCapabilities1 = parser.parseUnsignedNumber(2); + this.serverLanguage = parser.parseUnsignedNumber(1); + this.serverStatus = parser.parseUnsignedNumber(2); + + this.protocol41 = (this.serverCapabilities1 & (1 << 9)) > 0; + + if (this.protocol41) { + this.serverCapabilities2 = parser.parseUnsignedNumber(2); + this.scrambleLength = parser.parseUnsignedNumber(1); + this.filler2 = parser.parseFiller(10); + // scrambleBuff2 should be 0x00 terminated, but sphinx does not do this + // so we assume scrambleBuff2 to be 12 byte and treat the next byte as a + // filler byte. + this.scrambleBuff2 = parser.parseBuffer(12); + this.filler3 = parser.parseFiller(1); + } else { + this.filler2 = parser.parseFiller(13); + } + + if (parser.reachedPacketEnd()) { + return; + } + + // According to the docs this should be 0x00 terminated, but MariaDB does + // not do this, so we assume this string to be packet terminated. + this.pluginData = parser.parsePacketTerminatedString(); + + // However, if there is a trailing '\0', strip it + var lastChar = this.pluginData.length - 1; + if (this.pluginData[lastChar] === '\0') { + this.pluginData = this.pluginData.substr(0, lastChar); + } +}; + +HandshakeInitializationPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.protocolVersion); + writer.writeNullTerminatedString(this.serverVersion); + writer.writeUnsignedNumber(4, this.threadId); + writer.writeBuffer(this.scrambleBuff1); + writer.writeFiller(1); + writer.writeUnsignedNumber(2, this.serverCapabilities1); + writer.writeUnsignedNumber(1, this.serverLanguage); + writer.writeUnsignedNumber(2, this.serverStatus); + if (this.protocol41) { + writer.writeUnsignedNumber(2, this.serverCapabilities2); + writer.writeUnsignedNumber(1, this.scrambleLength); + writer.writeFiller(10); + } + writer.writeNullTerminatedBuffer(this.scrambleBuff2); + + if (this.pluginData !== undefined) { + writer.writeNullTerminatedString(this.pluginData); + } +}; + +HandshakeInitializationPacket.prototype.scrambleBuff = function() { + var buffer = null; + + if (typeof this.scrambleBuff2 === 'undefined') { + buffer = Buffer.from(this.scrambleBuff1); + } else { + buffer = Buffer.allocUnsafe(this.scrambleBuff1.length + this.scrambleBuff2.length); + this.scrambleBuff1.copy(buffer, 0); + this.scrambleBuff2.copy(buffer, this.scrambleBuff1.length); + } + + return buffer; +}; + + +/***/ }), +/* 56 */ +/***/ (function(module, exports) { + +module.exports = LocalDataFilePacket; + +/** + * Create a new LocalDataFilePacket + * @constructor + * @param {Buffer} data The data contents of the packet + * @public + */ +function LocalDataFilePacket(data) { + this.data = data; +} + +LocalDataFilePacket.prototype.write = function(writer) { + writer.writeBuffer(this.data); +}; + + +/***/ }), +/* 57 */ +/***/ (function(module, exports) { + + +// Language-neutral expression to match ER_UPDATE_INFO +var ER_UPDATE_INFO_REGEXP = /^[^:0-9]+: [0-9]+[^:0-9]+: ([0-9]+)[^:0-9]+: [0-9]+[^:0-9]*$/; + +module.exports = OkPacket; +function OkPacket(options) { + options = options || {}; + + this.fieldCount = undefined; + this.affectedRows = undefined; + this.insertId = undefined; + this.serverStatus = undefined; + this.warningCount = undefined; + this.message = undefined; + this.protocol41 = options.protocol41; +} + +OkPacket.prototype.parse = function(parser) { + this.fieldCount = parser.parseUnsignedNumber(1); + this.affectedRows = parser.parseLengthCodedNumber(); + this.insertId = parser.parseLengthCodedNumber(); + if (this.protocol41) { + this.serverStatus = parser.parseUnsignedNumber(2); + this.warningCount = parser.parseUnsignedNumber(2); + } + this.message = parser.parsePacketTerminatedString(); + this.changedRows = 0; + + var m = ER_UPDATE_INFO_REGEXP.exec(this.message); + if (m !== null) { + this.changedRows = parseInt(m[1], 10); + } +}; + +OkPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, 0x00); + writer.writeLengthCodedNumber(this.affectedRows || 0); + writer.writeLengthCodedNumber(this.insertId || 0); + if (this.protocol41) { + writer.writeUnsignedNumber(2, this.serverStatus || 0); + writer.writeUnsignedNumber(2, this.warningCount || 0); + } + writer.writeString(this.message); +}; + + +/***/ }), +/* 58 */ +/***/ (function(module, exports) { + +module.exports = OldPasswordPacket; +function OldPasswordPacket(options) { + options = options || {}; + + this.scrambleBuff = options.scrambleBuff; +} + +OldPasswordPacket.prototype.parse = function(parser) { + this.scrambleBuff = parser.parseNullTerminatedBuffer(); +}; + +OldPasswordPacket.prototype.write = function(writer) { + writer.writeBuffer(this.scrambleBuff); + writer.writeFiller(1); +}; + + +/***/ }), +/* 59 */ +/***/ (function(module, exports) { + +module.exports = ResultSetHeaderPacket; +function ResultSetHeaderPacket(options) { + options = options || {}; + + this.fieldCount = options.fieldCount; + this.extra = options.extra; +} + +ResultSetHeaderPacket.prototype.parse = function(parser) { + this.fieldCount = parser.parseLengthCodedNumber(); + + if (parser.reachedPacketEnd()) return; + + this.extra = (this.fieldCount === null) + ? parser.parsePacketTerminatedString() + : parser.parseLengthCodedNumber(); +}; + +ResultSetHeaderPacket.prototype.write = function(writer) { + writer.writeLengthCodedNumber(this.fieldCount); + + if (this.extra !== undefined) { + writer.writeLengthCodedNumber(this.extra); + } +}; + + +/***/ }), +/* 60 */ +/***/ (function(module, exports, __webpack_require__) { + +var Types = __webpack_require__(12); +var Charsets = __webpack_require__(16); +var Field = __webpack_require__(17); +var IEEE_754_BINARY_64_PRECISION = Math.pow(2, 53); + +module.exports = RowDataPacket; +function RowDataPacket() { +} + +Object.defineProperty(RowDataPacket.prototype, 'parse', { + configurable : true, + enumerable : false, + value : parse +}); + +Object.defineProperty(RowDataPacket.prototype, '_typeCast', { + configurable : true, + enumerable : false, + value : typeCast +}); + +function parse(parser, fieldPackets, typeCast, nestTables, connection) { + var self = this; + var next = function () { + return self._typeCast(fieldPacket, parser, connection.config.timezone, connection.config.supportBigNumbers, connection.config.bigNumberStrings, connection.config.dateStrings); + }; + + for (var i = 0; i < fieldPackets.length; i++) { + var fieldPacket = fieldPackets[i]; + var value; + + if (typeof typeCast === 'function') { + value = typeCast.apply(connection, [ new Field({ packet: fieldPacket, parser: parser }), next ]); + } else { + value = (typeCast) + ? this._typeCast(fieldPacket, parser, connection.config.timezone, connection.config.supportBigNumbers, connection.config.bigNumberStrings, connection.config.dateStrings) + : ( (fieldPacket.charsetNr === Charsets.BINARY) + ? parser.parseLengthCodedBuffer() + : parser.parseLengthCodedString() ); + } + + if (typeof nestTables === 'string' && nestTables.length) { + this[fieldPacket.table + nestTables + fieldPacket.name] = value; + } else if (nestTables) { + this[fieldPacket.table] = this[fieldPacket.table] || {}; + this[fieldPacket.table][fieldPacket.name] = value; + } else { + this[fieldPacket.name] = value; + } + } +} + +function typeCast(field, parser, timeZone, supportBigNumbers, bigNumberStrings, dateStrings) { + var numberString; + + switch (field.type) { + case Types.TIMESTAMP: + case Types.TIMESTAMP2: + case Types.DATE: + case Types.DATETIME: + case Types.DATETIME2: + case Types.NEWDATE: + var dateString = parser.parseLengthCodedString(); + + if (typeMatch(field.type, dateStrings)) { + return dateString; + } + + if (dateString === null) { + return null; + } + + var originalString = dateString; + if (field.type === Types.DATE) { + dateString += ' 00:00:00'; + } + + if (timeZone !== 'local') { + dateString += ' ' + timeZone; + } + + var dt = new Date(dateString); + if (isNaN(dt.getTime())) { + return originalString; + } + + return dt; + case Types.TINY: + case Types.SHORT: + case Types.LONG: + case Types.INT24: + case Types.YEAR: + case Types.FLOAT: + case Types.DOUBLE: + numberString = parser.parseLengthCodedString(); + return (numberString === null || (field.zeroFill && numberString[0] === '0')) + ? numberString : Number(numberString); + case Types.NEWDECIMAL: + case Types.LONGLONG: + numberString = parser.parseLengthCodedString(); + return (numberString === null || (field.zeroFill && numberString[0] === '0')) + ? numberString + : ((supportBigNumbers && (bigNumberStrings || (Number(numberString) >= IEEE_754_BINARY_64_PRECISION) || Number(numberString) <= -IEEE_754_BINARY_64_PRECISION)) + ? numberString + : Number(numberString)); + case Types.BIT: + return parser.parseLengthCodedBuffer(); + case Types.STRING: + case Types.VAR_STRING: + case Types.TINY_BLOB: + case Types.MEDIUM_BLOB: + case Types.LONG_BLOB: + case Types.BLOB: + return (field.charsetNr === Charsets.BINARY) + ? parser.parseLengthCodedBuffer() + : parser.parseLengthCodedString(); + case Types.GEOMETRY: + return parser.parseGeometryValue(); + default: + return parser.parseLengthCodedString(); + } +} + +function typeMatch(type, list) { + if (Array.isArray(list)) { + for (var i = 0; i < list.length; i++) { + if (Types[list[i]] === type) return true; + } + return false; + } else { + return Boolean(list); + } +} + + +/***/ }), +/* 61 */ +/***/ (function(module, exports, __webpack_require__) { + +// http://dev.mysql.com/doc/internals/en/ssl.html +// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest + +var ClientConstants = __webpack_require__(9); + +module.exports = SSLRequestPacket; + +function SSLRequestPacket(options) { + options = options || {}; + this.clientFlags = options.clientFlags | ClientConstants.CLIENT_SSL; + this.maxPacketSize = options.maxPacketSize; + this.charsetNumber = options.charsetNumber; +} + +SSLRequestPacket.prototype.parse = function(parser) { + // TODO: check SSLRequest packet v41 vs pre v41 + this.clientFlags = parser.parseUnsignedNumber(4); + this.maxPacketSize = parser.parseUnsignedNumber(4); + this.charsetNumber = parser.parseUnsignedNumber(1); +}; + +SSLRequestPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(4, this.clientFlags); + writer.writeUnsignedNumber(4, this.maxPacketSize); + writer.writeUnsignedNumber(1, this.charsetNumber); + writer.writeFiller(23); +}; + + +/***/ }), +/* 62 */ +/***/ (function(module, exports) { + +module.exports = StatisticsPacket; +function StatisticsPacket() { + this.message = undefined; +} + +StatisticsPacket.prototype.parse = function(parser) { + this.message = parser.parsePacketTerminatedString(); + + var items = this.message.split(/\s\s/); + for (var i = 0; i < items.length; i++) { + var m = items[i].match(/^(.+)\:\s+(.+)$/); + if (m !== null) { + this[m[1].toLowerCase().replace(/\s/g, '_')] = Number(m[2]); + } + } +}; + +StatisticsPacket.prototype.write = function(writer) { + writer.writeString(this.message); +}; + + +/***/ }), +/* 63 */ +/***/ (function(module, exports) { + +module.exports = UseOldPasswordPacket; +function UseOldPasswordPacket(options) { + options = options || {}; + + this.firstByte = options.firstByte || 0xfe; +} + +UseOldPasswordPacket.prototype.parse = function(parser) { + this.firstByte = parser.parseUnsignedNumber(1); +}; + +UseOldPasswordPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.firstByte); +}; + + +/***/ }), +/* 64 */ +/***/ (function(module, exports) { + +/** + * MySQL error constants + * + * Extracted from version 5.7.21 + * + * !! Generated by generate-error-constants.js, do not modify by hand !! + */ + +exports.EE_CANTCREATEFILE = 1; +exports.EE_READ = 2; +exports.EE_WRITE = 3; +exports.EE_BADCLOSE = 4; +exports.EE_OUTOFMEMORY = 5; +exports.EE_DELETE = 6; +exports.EE_LINK = 7; +exports.EE_EOFERR = 9; +exports.EE_CANTLOCK = 10; +exports.EE_CANTUNLOCK = 11; +exports.EE_DIR = 12; +exports.EE_STAT = 13; +exports.EE_CANT_CHSIZE = 14; +exports.EE_CANT_OPEN_STREAM = 15; +exports.EE_GETWD = 16; +exports.EE_SETWD = 17; +exports.EE_LINK_WARNING = 18; +exports.EE_OPEN_WARNING = 19; +exports.EE_DISK_FULL = 20; +exports.EE_CANT_MKDIR = 21; +exports.EE_UNKNOWN_CHARSET = 22; +exports.EE_OUT_OF_FILERESOURCES = 23; +exports.EE_CANT_READLINK = 24; +exports.EE_CANT_SYMLINK = 25; +exports.EE_REALPATH = 26; +exports.EE_SYNC = 27; +exports.EE_UNKNOWN_COLLATION = 28; +exports.EE_FILENOTFOUND = 29; +exports.EE_FILE_NOT_CLOSED = 30; +exports.EE_CHANGE_OWNERSHIP = 31; +exports.EE_CHANGE_PERMISSIONS = 32; +exports.EE_CANT_SEEK = 33; +exports.EE_CAPACITY_EXCEEDED = 34; +exports.HA_ERR_KEY_NOT_FOUND = 120; +exports.HA_ERR_FOUND_DUPP_KEY = 121; +exports.HA_ERR_INTERNAL_ERROR = 122; +exports.HA_ERR_RECORD_CHANGED = 123; +exports.HA_ERR_WRONG_INDEX = 124; +exports.HA_ERR_CRASHED = 126; +exports.HA_ERR_WRONG_IN_RECORD = 127; +exports.HA_ERR_OUT_OF_MEM = 128; +exports.HA_ERR_NOT_A_TABLE = 130; +exports.HA_ERR_WRONG_COMMAND = 131; +exports.HA_ERR_OLD_FILE = 132; +exports.HA_ERR_NO_ACTIVE_RECORD = 133; +exports.HA_ERR_RECORD_DELETED = 134; +exports.HA_ERR_RECORD_FILE_FULL = 135; +exports.HA_ERR_INDEX_FILE_FULL = 136; +exports.HA_ERR_END_OF_FILE = 137; +exports.HA_ERR_UNSUPPORTED = 138; +exports.HA_ERR_TOO_BIG_ROW = 139; +exports.HA_WRONG_CREATE_OPTION = 140; +exports.HA_ERR_FOUND_DUPP_UNIQUE = 141; +exports.HA_ERR_UNKNOWN_CHARSET = 142; +exports.HA_ERR_WRONG_MRG_TABLE_DEF = 143; +exports.HA_ERR_CRASHED_ON_REPAIR = 144; +exports.HA_ERR_CRASHED_ON_USAGE = 145; +exports.HA_ERR_LOCK_WAIT_TIMEOUT = 146; +exports.HA_ERR_LOCK_TABLE_FULL = 147; +exports.HA_ERR_READ_ONLY_TRANSACTION = 148; +exports.HA_ERR_LOCK_DEADLOCK = 149; +exports.HA_ERR_CANNOT_ADD_FOREIGN = 150; +exports.HA_ERR_NO_REFERENCED_ROW = 151; +exports.HA_ERR_ROW_IS_REFERENCED = 152; +exports.HA_ERR_NO_SAVEPOINT = 153; +exports.HA_ERR_NON_UNIQUE_BLOCK_SIZE = 154; +exports.HA_ERR_NO_SUCH_TABLE = 155; +exports.HA_ERR_TABLE_EXIST = 156; +exports.HA_ERR_NO_CONNECTION = 157; +exports.HA_ERR_NULL_IN_SPATIAL = 158; +exports.HA_ERR_TABLE_DEF_CHANGED = 159; +exports.HA_ERR_NO_PARTITION_FOUND = 160; +exports.HA_ERR_RBR_LOGGING_FAILED = 161; +exports.HA_ERR_DROP_INDEX_FK = 162; +exports.HA_ERR_FOREIGN_DUPLICATE_KEY = 163; +exports.HA_ERR_TABLE_NEEDS_UPGRADE = 164; +exports.HA_ERR_TABLE_READONLY = 165; +exports.HA_ERR_AUTOINC_READ_FAILED = 166; +exports.HA_ERR_AUTOINC_ERANGE = 167; +exports.HA_ERR_GENERIC = 168; +exports.HA_ERR_RECORD_IS_THE_SAME = 169; +exports.HA_ERR_LOGGING_IMPOSSIBLE = 170; +exports.HA_ERR_CORRUPT_EVENT = 171; +exports.HA_ERR_NEW_FILE = 172; +exports.HA_ERR_ROWS_EVENT_APPLY = 173; +exports.HA_ERR_INITIALIZATION = 174; +exports.HA_ERR_FILE_TOO_SHORT = 175; +exports.HA_ERR_WRONG_CRC = 176; +exports.HA_ERR_TOO_MANY_CONCURRENT_TRXS = 177; +exports.HA_ERR_NOT_IN_LOCK_PARTITIONS = 178; +exports.HA_ERR_INDEX_COL_TOO_LONG = 179; +exports.HA_ERR_INDEX_CORRUPT = 180; +exports.HA_ERR_UNDO_REC_TOO_BIG = 181; +exports.HA_FTS_INVALID_DOCID = 182; +exports.HA_ERR_TABLE_IN_FK_CHECK = 183; +exports.HA_ERR_TABLESPACE_EXISTS = 184; +exports.HA_ERR_TOO_MANY_FIELDS = 185; +exports.HA_ERR_ROW_IN_WRONG_PARTITION = 186; +exports.HA_ERR_INNODB_READ_ONLY = 187; +exports.HA_ERR_FTS_EXCEED_RESULT_CACHE_LIMIT = 188; +exports.HA_ERR_TEMP_FILE_WRITE_FAILURE = 189; +exports.HA_ERR_INNODB_FORCED_RECOVERY = 190; +exports.HA_ERR_FTS_TOO_MANY_WORDS_IN_PHRASE = 191; +exports.HA_ERR_FK_DEPTH_EXCEEDED = 192; +exports.HA_MISSING_CREATE_OPTION = 193; +exports.HA_ERR_SE_OUT_OF_MEMORY = 194; +exports.HA_ERR_TABLE_CORRUPT = 195; +exports.HA_ERR_QUERY_INTERRUPTED = 196; +exports.HA_ERR_TABLESPACE_MISSING = 197; +exports.HA_ERR_TABLESPACE_IS_NOT_EMPTY = 198; +exports.HA_ERR_WRONG_FILE_NAME = 199; +exports.HA_ERR_NOT_ALLOWED_COMMAND = 200; +exports.HA_ERR_COMPUTE_FAILED = 201; +exports.ER_HASHCHK = 1000; +exports.ER_NISAMCHK = 1001; +exports.ER_NO = 1002; +exports.ER_YES = 1003; +exports.ER_CANT_CREATE_FILE = 1004; +exports.ER_CANT_CREATE_TABLE = 1005; +exports.ER_CANT_CREATE_DB = 1006; +exports.ER_DB_CREATE_EXISTS = 1007; +exports.ER_DB_DROP_EXISTS = 1008; +exports.ER_DB_DROP_DELETE = 1009; +exports.ER_DB_DROP_RMDIR = 1010; +exports.ER_CANT_DELETE_FILE = 1011; +exports.ER_CANT_FIND_SYSTEM_REC = 1012; +exports.ER_CANT_GET_STAT = 1013; +exports.ER_CANT_GET_WD = 1014; +exports.ER_CANT_LOCK = 1015; +exports.ER_CANT_OPEN_FILE = 1016; +exports.ER_FILE_NOT_FOUND = 1017; +exports.ER_CANT_READ_DIR = 1018; +exports.ER_CANT_SET_WD = 1019; +exports.ER_CHECKREAD = 1020; +exports.ER_DISK_FULL = 1021; +exports.ER_DUP_KEY = 1022; +exports.ER_ERROR_ON_CLOSE = 1023; +exports.ER_ERROR_ON_READ = 1024; +exports.ER_ERROR_ON_RENAME = 1025; +exports.ER_ERROR_ON_WRITE = 1026; +exports.ER_FILE_USED = 1027; +exports.ER_FILSORT_ABORT = 1028; +exports.ER_FORM_NOT_FOUND = 1029; +exports.ER_GET_ERRNO = 1030; +exports.ER_ILLEGAL_HA = 1031; +exports.ER_KEY_NOT_FOUND = 1032; +exports.ER_NOT_FORM_FILE = 1033; +exports.ER_NOT_KEYFILE = 1034; +exports.ER_OLD_KEYFILE = 1035; +exports.ER_OPEN_AS_READONLY = 1036; +exports.ER_OUTOFMEMORY = 1037; +exports.ER_OUT_OF_SORTMEMORY = 1038; +exports.ER_UNEXPECTED_EOF = 1039; +exports.ER_CON_COUNT_ERROR = 1040; +exports.ER_OUT_OF_RESOURCES = 1041; +exports.ER_BAD_HOST_ERROR = 1042; +exports.ER_HANDSHAKE_ERROR = 1043; +exports.ER_DBACCESS_DENIED_ERROR = 1044; +exports.ER_ACCESS_DENIED_ERROR = 1045; +exports.ER_NO_DB_ERROR = 1046; +exports.ER_UNKNOWN_COM_ERROR = 1047; +exports.ER_BAD_NULL_ERROR = 1048; +exports.ER_BAD_DB_ERROR = 1049; +exports.ER_TABLE_EXISTS_ERROR = 1050; +exports.ER_BAD_TABLE_ERROR = 1051; +exports.ER_NON_UNIQ_ERROR = 1052; +exports.ER_SERVER_SHUTDOWN = 1053; +exports.ER_BAD_FIELD_ERROR = 1054; +exports.ER_WRONG_FIELD_WITH_GROUP = 1055; +exports.ER_WRONG_GROUP_FIELD = 1056; +exports.ER_WRONG_SUM_SELECT = 1057; +exports.ER_WRONG_VALUE_COUNT = 1058; +exports.ER_TOO_LONG_IDENT = 1059; +exports.ER_DUP_FIELDNAME = 1060; +exports.ER_DUP_KEYNAME = 1061; +exports.ER_DUP_ENTRY = 1062; +exports.ER_WRONG_FIELD_SPEC = 1063; +exports.ER_PARSE_ERROR = 1064; +exports.ER_EMPTY_QUERY = 1065; +exports.ER_NONUNIQ_TABLE = 1066; +exports.ER_INVALID_DEFAULT = 1067; +exports.ER_MULTIPLE_PRI_KEY = 1068; +exports.ER_TOO_MANY_KEYS = 1069; +exports.ER_TOO_MANY_KEY_PARTS = 1070; +exports.ER_TOO_LONG_KEY = 1071; +exports.ER_KEY_COLUMN_DOES_NOT_EXITS = 1072; +exports.ER_BLOB_USED_AS_KEY = 1073; +exports.ER_TOO_BIG_FIELDLENGTH = 1074; +exports.ER_WRONG_AUTO_KEY = 1075; +exports.ER_READY = 1076; +exports.ER_NORMAL_SHUTDOWN = 1077; +exports.ER_GOT_SIGNAL = 1078; +exports.ER_SHUTDOWN_COMPLETE = 1079; +exports.ER_FORCING_CLOSE = 1080; +exports.ER_IPSOCK_ERROR = 1081; +exports.ER_NO_SUCH_INDEX = 1082; +exports.ER_WRONG_FIELD_TERMINATORS = 1083; +exports.ER_BLOBS_AND_NO_TERMINATED = 1084; +exports.ER_TEXTFILE_NOT_READABLE = 1085; +exports.ER_FILE_EXISTS_ERROR = 1086; +exports.ER_LOAD_INFO = 1087; +exports.ER_ALTER_INFO = 1088; +exports.ER_WRONG_SUB_KEY = 1089; +exports.ER_CANT_REMOVE_ALL_FIELDS = 1090; +exports.ER_CANT_DROP_FIELD_OR_KEY = 1091; +exports.ER_INSERT_INFO = 1092; +exports.ER_UPDATE_TABLE_USED = 1093; +exports.ER_NO_SUCH_THREAD = 1094; +exports.ER_KILL_DENIED_ERROR = 1095; +exports.ER_NO_TABLES_USED = 1096; +exports.ER_TOO_BIG_SET = 1097; +exports.ER_NO_UNIQUE_LOGFILE = 1098; +exports.ER_TABLE_NOT_LOCKED_FOR_WRITE = 1099; +exports.ER_TABLE_NOT_LOCKED = 1100; +exports.ER_BLOB_CANT_HAVE_DEFAULT = 1101; +exports.ER_WRONG_DB_NAME = 1102; +exports.ER_WRONG_TABLE_NAME = 1103; +exports.ER_TOO_BIG_SELECT = 1104; +exports.ER_UNKNOWN_ERROR = 1105; +exports.ER_UNKNOWN_PROCEDURE = 1106; +exports.ER_WRONG_PARAMCOUNT_TO_PROCEDURE = 1107; +exports.ER_WRONG_PARAMETERS_TO_PROCEDURE = 1108; +exports.ER_UNKNOWN_TABLE = 1109; +exports.ER_FIELD_SPECIFIED_TWICE = 1110; +exports.ER_INVALID_GROUP_FUNC_USE = 1111; +exports.ER_UNSUPPORTED_EXTENSION = 1112; +exports.ER_TABLE_MUST_HAVE_COLUMNS = 1113; +exports.ER_RECORD_FILE_FULL = 1114; +exports.ER_UNKNOWN_CHARACTER_SET = 1115; +exports.ER_TOO_MANY_TABLES = 1116; +exports.ER_TOO_MANY_FIELDS = 1117; +exports.ER_TOO_BIG_ROWSIZE = 1118; +exports.ER_STACK_OVERRUN = 1119; +exports.ER_WRONG_OUTER_JOIN = 1120; +exports.ER_NULL_COLUMN_IN_INDEX = 1121; +exports.ER_CANT_FIND_UDF = 1122; +exports.ER_CANT_INITIALIZE_UDF = 1123; +exports.ER_UDF_NO_PATHS = 1124; +exports.ER_UDF_EXISTS = 1125; +exports.ER_CANT_OPEN_LIBRARY = 1126; +exports.ER_CANT_FIND_DL_ENTRY = 1127; +exports.ER_FUNCTION_NOT_DEFINED = 1128; +exports.ER_HOST_IS_BLOCKED = 1129; +exports.ER_HOST_NOT_PRIVILEGED = 1130; +exports.ER_PASSWORD_ANONYMOUS_USER = 1131; +exports.ER_PASSWORD_NOT_ALLOWED = 1132; +exports.ER_PASSWORD_NO_MATCH = 1133; +exports.ER_UPDATE_INFO = 1134; +exports.ER_CANT_CREATE_THREAD = 1135; +exports.ER_WRONG_VALUE_COUNT_ON_ROW = 1136; +exports.ER_CANT_REOPEN_TABLE = 1137; +exports.ER_INVALID_USE_OF_NULL = 1138; +exports.ER_REGEXP_ERROR = 1139; +exports.ER_MIX_OF_GROUP_FUNC_AND_FIELDS = 1140; +exports.ER_NONEXISTING_GRANT = 1141; +exports.ER_TABLEACCESS_DENIED_ERROR = 1142; +exports.ER_COLUMNACCESS_DENIED_ERROR = 1143; +exports.ER_ILLEGAL_GRANT_FOR_TABLE = 1144; +exports.ER_GRANT_WRONG_HOST_OR_USER = 1145; +exports.ER_NO_SUCH_TABLE = 1146; +exports.ER_NONEXISTING_TABLE_GRANT = 1147; +exports.ER_NOT_ALLOWED_COMMAND = 1148; +exports.ER_SYNTAX_ERROR = 1149; +exports.ER_DELAYED_CANT_CHANGE_LOCK = 1150; +exports.ER_TOO_MANY_DELAYED_THREADS = 1151; +exports.ER_ABORTING_CONNECTION = 1152; +exports.ER_NET_PACKET_TOO_LARGE = 1153; +exports.ER_NET_READ_ERROR_FROM_PIPE = 1154; +exports.ER_NET_FCNTL_ERROR = 1155; +exports.ER_NET_PACKETS_OUT_OF_ORDER = 1156; +exports.ER_NET_UNCOMPRESS_ERROR = 1157; +exports.ER_NET_READ_ERROR = 1158; +exports.ER_NET_READ_INTERRUPTED = 1159; +exports.ER_NET_ERROR_ON_WRITE = 1160; +exports.ER_NET_WRITE_INTERRUPTED = 1161; +exports.ER_TOO_LONG_STRING = 1162; +exports.ER_TABLE_CANT_HANDLE_BLOB = 1163; +exports.ER_TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164; +exports.ER_DELAYED_INSERT_TABLE_LOCKED = 1165; +exports.ER_WRONG_COLUMN_NAME = 1166; +exports.ER_WRONG_KEY_COLUMN = 1167; +exports.ER_WRONG_MRG_TABLE = 1168; +exports.ER_DUP_UNIQUE = 1169; +exports.ER_BLOB_KEY_WITHOUT_LENGTH = 1170; +exports.ER_PRIMARY_CANT_HAVE_NULL = 1171; +exports.ER_TOO_MANY_ROWS = 1172; +exports.ER_REQUIRES_PRIMARY_KEY = 1173; +exports.ER_NO_RAID_COMPILED = 1174; +exports.ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175; +exports.ER_KEY_DOES_NOT_EXITS = 1176; +exports.ER_CHECK_NO_SUCH_TABLE = 1177; +exports.ER_CHECK_NOT_IMPLEMENTED = 1178; +exports.ER_CANT_DO_THIS_DURING_AN_TRANSACTION = 1179; +exports.ER_ERROR_DURING_COMMIT = 1180; +exports.ER_ERROR_DURING_ROLLBACK = 1181; +exports.ER_ERROR_DURING_FLUSH_LOGS = 1182; +exports.ER_ERROR_DURING_CHECKPOINT = 1183; +exports.ER_NEW_ABORTING_CONNECTION = 1184; +exports.ER_DUMP_NOT_IMPLEMENTED = 1185; +exports.ER_FLUSH_MASTER_BINLOG_CLOSED = 1186; +exports.ER_INDEX_REBUILD = 1187; +exports.ER_MASTER = 1188; +exports.ER_MASTER_NET_READ = 1189; +exports.ER_MASTER_NET_WRITE = 1190; +exports.ER_FT_MATCHING_KEY_NOT_FOUND = 1191; +exports.ER_LOCK_OR_ACTIVE_TRANSACTION = 1192; +exports.ER_UNKNOWN_SYSTEM_VARIABLE = 1193; +exports.ER_CRASHED_ON_USAGE = 1194; +exports.ER_CRASHED_ON_REPAIR = 1195; +exports.ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196; +exports.ER_TRANS_CACHE_FULL = 1197; +exports.ER_SLAVE_MUST_STOP = 1198; +exports.ER_SLAVE_NOT_RUNNING = 1199; +exports.ER_BAD_SLAVE = 1200; +exports.ER_MASTER_INFO = 1201; +exports.ER_SLAVE_THREAD = 1202; +exports.ER_TOO_MANY_USER_CONNECTIONS = 1203; +exports.ER_SET_CONSTANTS_ONLY = 1204; +exports.ER_LOCK_WAIT_TIMEOUT = 1205; +exports.ER_LOCK_TABLE_FULL = 1206; +exports.ER_READ_ONLY_TRANSACTION = 1207; +exports.ER_DROP_DB_WITH_READ_LOCK = 1208; +exports.ER_CREATE_DB_WITH_READ_LOCK = 1209; +exports.ER_WRONG_ARGUMENTS = 1210; +exports.ER_NO_PERMISSION_TO_CREATE_USER = 1211; +exports.ER_UNION_TABLES_IN_DIFFERENT_DIR = 1212; +exports.ER_LOCK_DEADLOCK = 1213; +exports.ER_TABLE_CANT_HANDLE_FT = 1214; +exports.ER_CANNOT_ADD_FOREIGN = 1215; +exports.ER_NO_REFERENCED_ROW = 1216; +exports.ER_ROW_IS_REFERENCED = 1217; +exports.ER_CONNECT_TO_MASTER = 1218; +exports.ER_QUERY_ON_MASTER = 1219; +exports.ER_ERROR_WHEN_EXECUTING_COMMAND = 1220; +exports.ER_WRONG_USAGE = 1221; +exports.ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222; +exports.ER_CANT_UPDATE_WITH_READLOCK = 1223; +exports.ER_MIXING_NOT_ALLOWED = 1224; +exports.ER_DUP_ARGUMENT = 1225; +exports.ER_USER_LIMIT_REACHED = 1226; +exports.ER_SPECIFIC_ACCESS_DENIED_ERROR = 1227; +exports.ER_LOCAL_VARIABLE = 1228; +exports.ER_GLOBAL_VARIABLE = 1229; +exports.ER_NO_DEFAULT = 1230; +exports.ER_WRONG_VALUE_FOR_VAR = 1231; +exports.ER_WRONG_TYPE_FOR_VAR = 1232; +exports.ER_VAR_CANT_BE_READ = 1233; +exports.ER_CANT_USE_OPTION_HERE = 1234; +exports.ER_NOT_SUPPORTED_YET = 1235; +exports.ER_MASTER_FATAL_ERROR_READING_BINLOG = 1236; +exports.ER_SLAVE_IGNORED_TABLE = 1237; +exports.ER_INCORRECT_GLOBAL_LOCAL_VAR = 1238; +exports.ER_WRONG_FK_DEF = 1239; +exports.ER_KEY_REF_DO_NOT_MATCH_TABLE_REF = 1240; +exports.ER_OPERAND_COLUMNS = 1241; +exports.ER_SUBQUERY_NO_1_ROW = 1242; +exports.ER_UNKNOWN_STMT_HANDLER = 1243; +exports.ER_CORRUPT_HELP_DB = 1244; +exports.ER_CYCLIC_REFERENCE = 1245; +exports.ER_AUTO_CONVERT = 1246; +exports.ER_ILLEGAL_REFERENCE = 1247; +exports.ER_DERIVED_MUST_HAVE_ALIAS = 1248; +exports.ER_SELECT_REDUCED = 1249; +exports.ER_TABLENAME_NOT_ALLOWED_HERE = 1250; +exports.ER_NOT_SUPPORTED_AUTH_MODE = 1251; +exports.ER_SPATIAL_CANT_HAVE_NULL = 1252; +exports.ER_COLLATION_CHARSET_MISMATCH = 1253; +exports.ER_SLAVE_WAS_RUNNING = 1254; +exports.ER_SLAVE_WAS_NOT_RUNNING = 1255; +exports.ER_TOO_BIG_FOR_UNCOMPRESS = 1256; +exports.ER_ZLIB_Z_MEM_ERROR = 1257; +exports.ER_ZLIB_Z_BUF_ERROR = 1258; +exports.ER_ZLIB_Z_DATA_ERROR = 1259; +exports.ER_CUT_VALUE_GROUP_CONCAT = 1260; +exports.ER_WARN_TOO_FEW_RECORDS = 1261; +exports.ER_WARN_TOO_MANY_RECORDS = 1262; +exports.ER_WARN_NULL_TO_NOTNULL = 1263; +exports.ER_WARN_DATA_OUT_OF_RANGE = 1264; +exports.WARN_DATA_TRUNCATED = 1265; +exports.ER_WARN_USING_OTHER_HANDLER = 1266; +exports.ER_CANT_AGGREGATE_2COLLATIONS = 1267; +exports.ER_DROP_USER = 1268; +exports.ER_REVOKE_GRANTS = 1269; +exports.ER_CANT_AGGREGATE_3COLLATIONS = 1270; +exports.ER_CANT_AGGREGATE_NCOLLATIONS = 1271; +exports.ER_VARIABLE_IS_NOT_STRUCT = 1272; +exports.ER_UNKNOWN_COLLATION = 1273; +exports.ER_SLAVE_IGNORED_SSL_PARAMS = 1274; +exports.ER_SERVER_IS_IN_SECURE_AUTH_MODE = 1275; +exports.ER_WARN_FIELD_RESOLVED = 1276; +exports.ER_BAD_SLAVE_UNTIL_COND = 1277; +exports.ER_MISSING_SKIP_SLAVE = 1278; +exports.ER_UNTIL_COND_IGNORED = 1279; +exports.ER_WRONG_NAME_FOR_INDEX = 1280; +exports.ER_WRONG_NAME_FOR_CATALOG = 1281; +exports.ER_WARN_QC_RESIZE = 1282; +exports.ER_BAD_FT_COLUMN = 1283; +exports.ER_UNKNOWN_KEY_CACHE = 1284; +exports.ER_WARN_HOSTNAME_WONT_WORK = 1285; +exports.ER_UNKNOWN_STORAGE_ENGINE = 1286; +exports.ER_WARN_DEPRECATED_SYNTAX = 1287; +exports.ER_NON_UPDATABLE_TABLE = 1288; +exports.ER_FEATURE_DISABLED = 1289; +exports.ER_OPTION_PREVENTS_STATEMENT = 1290; +exports.ER_DUPLICATED_VALUE_IN_TYPE = 1291; +exports.ER_TRUNCATED_WRONG_VALUE = 1292; +exports.ER_TOO_MUCH_AUTO_TIMESTAMP_COLS = 1293; +exports.ER_INVALID_ON_UPDATE = 1294; +exports.ER_UNSUPPORTED_PS = 1295; +exports.ER_GET_ERRMSG = 1296; +exports.ER_GET_TEMPORARY_ERRMSG = 1297; +exports.ER_UNKNOWN_TIME_ZONE = 1298; +exports.ER_WARN_INVALID_TIMESTAMP = 1299; +exports.ER_INVALID_CHARACTER_STRING = 1300; +exports.ER_WARN_ALLOWED_PACKET_OVERFLOWED = 1301; +exports.ER_CONFLICTING_DECLARATIONS = 1302; +exports.ER_SP_NO_RECURSIVE_CREATE = 1303; +exports.ER_SP_ALREADY_EXISTS = 1304; +exports.ER_SP_DOES_NOT_EXIST = 1305; +exports.ER_SP_DROP_FAILED = 1306; +exports.ER_SP_STORE_FAILED = 1307; +exports.ER_SP_LILABEL_MISMATCH = 1308; +exports.ER_SP_LABEL_REDEFINE = 1309; +exports.ER_SP_LABEL_MISMATCH = 1310; +exports.ER_SP_UNINIT_VAR = 1311; +exports.ER_SP_BADSELECT = 1312; +exports.ER_SP_BADRETURN = 1313; +exports.ER_SP_BADSTATEMENT = 1314; +exports.ER_UPDATE_LOG_DEPRECATED_IGNORED = 1315; +exports.ER_UPDATE_LOG_DEPRECATED_TRANSLATED = 1316; +exports.ER_QUERY_INTERRUPTED = 1317; +exports.ER_SP_WRONG_NO_OF_ARGS = 1318; +exports.ER_SP_COND_MISMATCH = 1319; +exports.ER_SP_NORETURN = 1320; +exports.ER_SP_NORETURNEND = 1321; +exports.ER_SP_BAD_CURSOR_QUERY = 1322; +exports.ER_SP_BAD_CURSOR_SELECT = 1323; +exports.ER_SP_CURSOR_MISMATCH = 1324; +exports.ER_SP_CURSOR_ALREADY_OPEN = 1325; +exports.ER_SP_CURSOR_NOT_OPEN = 1326; +exports.ER_SP_UNDECLARED_VAR = 1327; +exports.ER_SP_WRONG_NO_OF_FETCH_ARGS = 1328; +exports.ER_SP_FETCH_NO_DATA = 1329; +exports.ER_SP_DUP_PARAM = 1330; +exports.ER_SP_DUP_VAR = 1331; +exports.ER_SP_DUP_COND = 1332; +exports.ER_SP_DUP_CURS = 1333; +exports.ER_SP_CANT_ALTER = 1334; +exports.ER_SP_SUBSELECT_NYI = 1335; +exports.ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG = 1336; +exports.ER_SP_VARCOND_AFTER_CURSHNDLR = 1337; +exports.ER_SP_CURSOR_AFTER_HANDLER = 1338; +exports.ER_SP_CASE_NOT_FOUND = 1339; +exports.ER_FPARSER_TOO_BIG_FILE = 1340; +exports.ER_FPARSER_BAD_HEADER = 1341; +exports.ER_FPARSER_EOF_IN_COMMENT = 1342; +exports.ER_FPARSER_ERROR_IN_PARAMETER = 1343; +exports.ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344; +exports.ER_VIEW_NO_EXPLAIN = 1345; +exports.ER_FRM_UNKNOWN_TYPE = 1346; +exports.ER_WRONG_OBJECT = 1347; +exports.ER_NONUPDATEABLE_COLUMN = 1348; +exports.ER_VIEW_SELECT_DERIVED = 1349; +exports.ER_VIEW_SELECT_CLAUSE = 1350; +exports.ER_VIEW_SELECT_VARIABLE = 1351; +exports.ER_VIEW_SELECT_TMPTABLE = 1352; +exports.ER_VIEW_WRONG_LIST = 1353; +exports.ER_WARN_VIEW_MERGE = 1354; +exports.ER_WARN_VIEW_WITHOUT_KEY = 1355; +exports.ER_VIEW_INVALID = 1356; +exports.ER_SP_NO_DROP_SP = 1357; +exports.ER_SP_GOTO_IN_HNDLR = 1358; +exports.ER_TRG_ALREADY_EXISTS = 1359; +exports.ER_TRG_DOES_NOT_EXIST = 1360; +exports.ER_TRG_ON_VIEW_OR_TEMP_TABLE = 1361; +exports.ER_TRG_CANT_CHANGE_ROW = 1362; +exports.ER_TRG_NO_SUCH_ROW_IN_TRG = 1363; +exports.ER_NO_DEFAULT_FOR_FIELD = 1364; +exports.ER_DIVISION_BY_ZERO = 1365; +exports.ER_TRUNCATED_WRONG_VALUE_FOR_FIELD = 1366; +exports.ER_ILLEGAL_VALUE_FOR_TYPE = 1367; +exports.ER_VIEW_NONUPD_CHECK = 1368; +exports.ER_VIEW_CHECK_FAILED = 1369; +exports.ER_PROCACCESS_DENIED_ERROR = 1370; +exports.ER_RELAY_LOG_FAIL = 1371; +exports.ER_PASSWD_LENGTH = 1372; +exports.ER_UNKNOWN_TARGET_BINLOG = 1373; +exports.ER_IO_ERR_LOG_INDEX_READ = 1374; +exports.ER_BINLOG_PURGE_PROHIBITED = 1375; +exports.ER_FSEEK_FAIL = 1376; +exports.ER_BINLOG_PURGE_FATAL_ERR = 1377; +exports.ER_LOG_IN_USE = 1378; +exports.ER_LOG_PURGE_UNKNOWN_ERR = 1379; +exports.ER_RELAY_LOG_INIT = 1380; +exports.ER_NO_BINARY_LOGGING = 1381; +exports.ER_RESERVED_SYNTAX = 1382; +exports.ER_WSAS_FAILED = 1383; +exports.ER_DIFF_GROUPS_PROC = 1384; +exports.ER_NO_GROUP_FOR_PROC = 1385; +exports.ER_ORDER_WITH_PROC = 1386; +exports.ER_LOGGING_PROHIBIT_CHANGING_OF = 1387; +exports.ER_NO_FILE_MAPPING = 1388; +exports.ER_WRONG_MAGIC = 1389; +exports.ER_PS_MANY_PARAM = 1390; +exports.ER_KEY_PART_0 = 1391; +exports.ER_VIEW_CHECKSUM = 1392; +exports.ER_VIEW_MULTIUPDATE = 1393; +exports.ER_VIEW_NO_INSERT_FIELD_LIST = 1394; +exports.ER_VIEW_DELETE_MERGE_VIEW = 1395; +exports.ER_CANNOT_USER = 1396; +exports.ER_XAER_NOTA = 1397; +exports.ER_XAER_INVAL = 1398; +exports.ER_XAER_RMFAIL = 1399; +exports.ER_XAER_OUTSIDE = 1400; +exports.ER_XAER_RMERR = 1401; +exports.ER_XA_RBROLLBACK = 1402; +exports.ER_NONEXISTING_PROC_GRANT = 1403; +exports.ER_PROC_AUTO_GRANT_FAIL = 1404; +exports.ER_PROC_AUTO_REVOKE_FAIL = 1405; +exports.ER_DATA_TOO_LONG = 1406; +exports.ER_SP_BAD_SQLSTATE = 1407; +exports.ER_STARTUP = 1408; +exports.ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR = 1409; +exports.ER_CANT_CREATE_USER_WITH_GRANT = 1410; +exports.ER_WRONG_VALUE_FOR_TYPE = 1411; +exports.ER_TABLE_DEF_CHANGED = 1412; +exports.ER_SP_DUP_HANDLER = 1413; +exports.ER_SP_NOT_VAR_ARG = 1414; +exports.ER_SP_NO_RETSET = 1415; +exports.ER_CANT_CREATE_GEOMETRY_OBJECT = 1416; +exports.ER_FAILED_ROUTINE_BREAK_BINLOG = 1417; +exports.ER_BINLOG_UNSAFE_ROUTINE = 1418; +exports.ER_BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419; +exports.ER_EXEC_STMT_WITH_OPEN_CURSOR = 1420; +exports.ER_STMT_HAS_NO_OPEN_CURSOR = 1421; +exports.ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422; +exports.ER_NO_DEFAULT_FOR_VIEW_FIELD = 1423; +exports.ER_SP_NO_RECURSION = 1424; +exports.ER_TOO_BIG_SCALE = 1425; +exports.ER_TOO_BIG_PRECISION = 1426; +exports.ER_M_BIGGER_THAN_D = 1427; +exports.ER_WRONG_LOCK_OF_SYSTEM_TABLE = 1428; +exports.ER_CONNECT_TO_FOREIGN_DATA_SOURCE = 1429; +exports.ER_QUERY_ON_FOREIGN_DATA_SOURCE = 1430; +exports.ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431; +exports.ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432; +exports.ER_FOREIGN_DATA_STRING_INVALID = 1433; +exports.ER_CANT_CREATE_FEDERATED_TABLE = 1434; +exports.ER_TRG_IN_WRONG_SCHEMA = 1435; +exports.ER_STACK_OVERRUN_NEED_MORE = 1436; +exports.ER_TOO_LONG_BODY = 1437; +exports.ER_WARN_CANT_DROP_DEFAULT_KEYCACHE = 1438; +exports.ER_TOO_BIG_DISPLAYWIDTH = 1439; +exports.ER_XAER_DUPID = 1440; +exports.ER_DATETIME_FUNCTION_OVERFLOW = 1441; +exports.ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG = 1442; +exports.ER_VIEW_PREVENT_UPDATE = 1443; +exports.ER_PS_NO_RECURSION = 1444; +exports.ER_SP_CANT_SET_AUTOCOMMIT = 1445; +exports.ER_MALFORMED_DEFINER = 1446; +exports.ER_VIEW_FRM_NO_USER = 1447; +exports.ER_VIEW_OTHER_USER = 1448; +exports.ER_NO_SUCH_USER = 1449; +exports.ER_FORBID_SCHEMA_CHANGE = 1450; +exports.ER_ROW_IS_REFERENCED_2 = 1451; +exports.ER_NO_REFERENCED_ROW_2 = 1452; +exports.ER_SP_BAD_VAR_SHADOW = 1453; +exports.ER_TRG_NO_DEFINER = 1454; +exports.ER_OLD_FILE_FORMAT = 1455; +exports.ER_SP_RECURSION_LIMIT = 1456; +exports.ER_SP_PROC_TABLE_CORRUPT = 1457; +exports.ER_SP_WRONG_NAME = 1458; +exports.ER_TABLE_NEEDS_UPGRADE = 1459; +exports.ER_SP_NO_AGGREGATE = 1460; +exports.ER_MAX_PREPARED_STMT_COUNT_REACHED = 1461; +exports.ER_VIEW_RECURSIVE = 1462; +exports.ER_NON_GROUPING_FIELD_USED = 1463; +exports.ER_TABLE_CANT_HANDLE_SPKEYS = 1464; +exports.ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA = 1465; +exports.ER_REMOVED_SPACES = 1466; +exports.ER_AUTOINC_READ_FAILED = 1467; +exports.ER_USERNAME = 1468; +exports.ER_HOSTNAME = 1469; +exports.ER_WRONG_STRING_LENGTH = 1470; +exports.ER_NON_INSERTABLE_TABLE = 1471; +exports.ER_ADMIN_WRONG_MRG_TABLE = 1472; +exports.ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT = 1473; +exports.ER_NAME_BECOMES_EMPTY = 1474; +exports.ER_AMBIGUOUS_FIELD_TERM = 1475; +exports.ER_FOREIGN_SERVER_EXISTS = 1476; +exports.ER_FOREIGN_SERVER_DOESNT_EXIST = 1477; +exports.ER_ILLEGAL_HA_CREATE_OPTION = 1478; +exports.ER_PARTITION_REQUIRES_VALUES_ERROR = 1479; +exports.ER_PARTITION_WRONG_VALUES_ERROR = 1480; +exports.ER_PARTITION_MAXVALUE_ERROR = 1481; +exports.ER_PARTITION_SUBPARTITION_ERROR = 1482; +exports.ER_PARTITION_SUBPART_MIX_ERROR = 1483; +exports.ER_PARTITION_WRONG_NO_PART_ERROR = 1484; +exports.ER_PARTITION_WRONG_NO_SUBPART_ERROR = 1485; +exports.ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR = 1486; +exports.ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR = 1487; +exports.ER_FIELD_NOT_FOUND_PART_ERROR = 1488; +exports.ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR = 1489; +exports.ER_INCONSISTENT_PARTITION_INFO_ERROR = 1490; +exports.ER_PARTITION_FUNC_NOT_ALLOWED_ERROR = 1491; +exports.ER_PARTITIONS_MUST_BE_DEFINED_ERROR = 1492; +exports.ER_RANGE_NOT_INCREASING_ERROR = 1493; +exports.ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR = 1494; +exports.ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR = 1495; +exports.ER_PARTITION_ENTRY_ERROR = 1496; +exports.ER_MIX_HANDLER_ERROR = 1497; +exports.ER_PARTITION_NOT_DEFINED_ERROR = 1498; +exports.ER_TOO_MANY_PARTITIONS_ERROR = 1499; +exports.ER_SUBPARTITION_ERROR = 1500; +exports.ER_CANT_CREATE_HANDLER_FILE = 1501; +exports.ER_BLOB_FIELD_IN_PART_FUNC_ERROR = 1502; +exports.ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF = 1503; +exports.ER_NO_PARTS_ERROR = 1504; +exports.ER_PARTITION_MGMT_ON_NONPARTITIONED = 1505; +exports.ER_FOREIGN_KEY_ON_PARTITIONED = 1506; +exports.ER_DROP_PARTITION_NON_EXISTENT = 1507; +exports.ER_DROP_LAST_PARTITION = 1508; +exports.ER_COALESCE_ONLY_ON_HASH_PARTITION = 1509; +exports.ER_REORG_HASH_ONLY_ON_SAME_NO = 1510; +exports.ER_REORG_NO_PARAM_ERROR = 1511; +exports.ER_ONLY_ON_RANGE_LIST_PARTITION = 1512; +exports.ER_ADD_PARTITION_SUBPART_ERROR = 1513; +exports.ER_ADD_PARTITION_NO_NEW_PARTITION = 1514; +exports.ER_COALESCE_PARTITION_NO_PARTITION = 1515; +exports.ER_REORG_PARTITION_NOT_EXIST = 1516; +exports.ER_SAME_NAME_PARTITION = 1517; +exports.ER_NO_BINLOG_ERROR = 1518; +exports.ER_CONSECUTIVE_REORG_PARTITIONS = 1519; +exports.ER_REORG_OUTSIDE_RANGE = 1520; +exports.ER_PARTITION_FUNCTION_FAILURE = 1521; +exports.ER_PART_STATE_ERROR = 1522; +exports.ER_LIMITED_PART_RANGE = 1523; +exports.ER_PLUGIN_IS_NOT_LOADED = 1524; +exports.ER_WRONG_VALUE = 1525; +exports.ER_NO_PARTITION_FOR_GIVEN_VALUE = 1526; +exports.ER_FILEGROUP_OPTION_ONLY_ONCE = 1527; +exports.ER_CREATE_FILEGROUP_FAILED = 1528; +exports.ER_DROP_FILEGROUP_FAILED = 1529; +exports.ER_TABLESPACE_AUTO_EXTEND_ERROR = 1530; +exports.ER_WRONG_SIZE_NUMBER = 1531; +exports.ER_SIZE_OVERFLOW_ERROR = 1532; +exports.ER_ALTER_FILEGROUP_FAILED = 1533; +exports.ER_BINLOG_ROW_LOGGING_FAILED = 1534; +exports.ER_BINLOG_ROW_WRONG_TABLE_DEF = 1535; +exports.ER_BINLOG_ROW_RBR_TO_SBR = 1536; +exports.ER_EVENT_ALREADY_EXISTS = 1537; +exports.ER_EVENT_STORE_FAILED = 1538; +exports.ER_EVENT_DOES_NOT_EXIST = 1539; +exports.ER_EVENT_CANT_ALTER = 1540; +exports.ER_EVENT_DROP_FAILED = 1541; +exports.ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG = 1542; +exports.ER_EVENT_ENDS_BEFORE_STARTS = 1543; +exports.ER_EVENT_EXEC_TIME_IN_THE_PAST = 1544; +exports.ER_EVENT_OPEN_TABLE_FAILED = 1545; +exports.ER_EVENT_NEITHER_M_EXPR_NOR_M_AT = 1546; +exports.ER_COL_COUNT_DOESNT_MATCH_CORRUPTED = 1547; +exports.ER_CANNOT_LOAD_FROM_TABLE = 1548; +exports.ER_EVENT_CANNOT_DELETE = 1549; +exports.ER_EVENT_COMPILE_ERROR = 1550; +exports.ER_EVENT_SAME_NAME = 1551; +exports.ER_EVENT_DATA_TOO_LONG = 1552; +exports.ER_DROP_INDEX_FK = 1553; +exports.ER_WARN_DEPRECATED_SYNTAX_WITH_VER = 1554; +exports.ER_CANT_WRITE_LOCK_LOG_TABLE = 1555; +exports.ER_CANT_LOCK_LOG_TABLE = 1556; +exports.ER_FOREIGN_DUPLICATE_KEY = 1557; +exports.ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE = 1558; +exports.ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR = 1559; +exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1560; +exports.ER_NDB_CANT_SWITCH_BINLOG_FORMAT = 1561; +exports.ER_PARTITION_NO_TEMPORARY = 1562; +exports.ER_PARTITION_CONST_DOMAIN_ERROR = 1563; +exports.ER_PARTITION_FUNCTION_IS_NOT_ALLOWED = 1564; +exports.ER_DDL_LOG_ERROR = 1565; +exports.ER_NULL_IN_VALUES_LESS_THAN = 1566; +exports.ER_WRONG_PARTITION_NAME = 1567; +exports.ER_CANT_CHANGE_TX_CHARACTERISTICS = 1568; +exports.ER_DUP_ENTRY_AUTOINCREMENT_CASE = 1569; +exports.ER_EVENT_MODIFY_QUEUE_ERROR = 1570; +exports.ER_EVENT_SET_VAR_ERROR = 1571; +exports.ER_PARTITION_MERGE_ERROR = 1572; +exports.ER_CANT_ACTIVATE_LOG = 1573; +exports.ER_RBR_NOT_AVAILABLE = 1574; +exports.ER_BASE64_DECODE_ERROR = 1575; +exports.ER_EVENT_RECURSION_FORBIDDEN = 1576; +exports.ER_EVENTS_DB_ERROR = 1577; +exports.ER_ONLY_INTEGERS_ALLOWED = 1578; +exports.ER_UNSUPORTED_LOG_ENGINE = 1579; +exports.ER_BAD_LOG_STATEMENT = 1580; +exports.ER_CANT_RENAME_LOG_TABLE = 1581; +exports.ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT = 1582; +exports.ER_WRONG_PARAMETERS_TO_NATIVE_FCT = 1583; +exports.ER_WRONG_PARAMETERS_TO_STORED_FCT = 1584; +exports.ER_NATIVE_FCT_NAME_COLLISION = 1585; +exports.ER_DUP_ENTRY_WITH_KEY_NAME = 1586; +exports.ER_BINLOG_PURGE_EMFILE = 1587; +exports.ER_EVENT_CANNOT_CREATE_IN_THE_PAST = 1588; +exports.ER_EVENT_CANNOT_ALTER_IN_THE_PAST = 1589; +exports.ER_SLAVE_INCIDENT = 1590; +exports.ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT = 1591; +exports.ER_BINLOG_UNSAFE_STATEMENT = 1592; +exports.ER_SLAVE_FATAL_ERROR = 1593; +exports.ER_SLAVE_RELAY_LOG_READ_FAILURE = 1594; +exports.ER_SLAVE_RELAY_LOG_WRITE_FAILURE = 1595; +exports.ER_SLAVE_CREATE_EVENT_FAILURE = 1596; +exports.ER_SLAVE_MASTER_COM_FAILURE = 1597; +exports.ER_BINLOG_LOGGING_IMPOSSIBLE = 1598; +exports.ER_VIEW_NO_CREATION_CTX = 1599; +exports.ER_VIEW_INVALID_CREATION_CTX = 1600; +exports.ER_SR_INVALID_CREATION_CTX = 1601; +exports.ER_TRG_CORRUPTED_FILE = 1602; +exports.ER_TRG_NO_CREATION_CTX = 1603; +exports.ER_TRG_INVALID_CREATION_CTX = 1604; +exports.ER_EVENT_INVALID_CREATION_CTX = 1605; +exports.ER_TRG_CANT_OPEN_TABLE = 1606; +exports.ER_CANT_CREATE_SROUTINE = 1607; +exports.ER_NEVER_USED = 1608; +exports.ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT = 1609; +exports.ER_SLAVE_CORRUPT_EVENT = 1610; +exports.ER_LOAD_DATA_INVALID_COLUMN = 1611; +exports.ER_LOG_PURGE_NO_FILE = 1612; +exports.ER_XA_RBTIMEOUT = 1613; +exports.ER_XA_RBDEADLOCK = 1614; +exports.ER_NEED_REPREPARE = 1615; +exports.ER_DELAYED_NOT_SUPPORTED = 1616; +exports.WARN_NO_MASTER_INFO = 1617; +exports.WARN_OPTION_IGNORED = 1618; +exports.ER_PLUGIN_DELETE_BUILTIN = 1619; +exports.WARN_PLUGIN_BUSY = 1620; +exports.ER_VARIABLE_IS_READONLY = 1621; +exports.ER_WARN_ENGINE_TRANSACTION_ROLLBACK = 1622; +exports.ER_SLAVE_HEARTBEAT_FAILURE = 1623; +exports.ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE = 1624; +exports.ER_NDB_REPLICATION_SCHEMA_ERROR = 1625; +exports.ER_CONFLICT_FN_PARSE_ERROR = 1626; +exports.ER_EXCEPTIONS_WRITE_ERROR = 1627; +exports.ER_TOO_LONG_TABLE_COMMENT = 1628; +exports.ER_TOO_LONG_FIELD_COMMENT = 1629; +exports.ER_FUNC_INEXISTENT_NAME_COLLISION = 1630; +exports.ER_DATABASE_NAME = 1631; +exports.ER_TABLE_NAME = 1632; +exports.ER_PARTITION_NAME = 1633; +exports.ER_SUBPARTITION_NAME = 1634; +exports.ER_TEMPORARY_NAME = 1635; +exports.ER_RENAMED_NAME = 1636; +exports.ER_TOO_MANY_CONCURRENT_TRXS = 1637; +exports.WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED = 1638; +exports.ER_DEBUG_SYNC_TIMEOUT = 1639; +exports.ER_DEBUG_SYNC_HIT_LIMIT = 1640; +exports.ER_DUP_SIGNAL_SET = 1641; +exports.ER_SIGNAL_WARN = 1642; +exports.ER_SIGNAL_NOT_FOUND = 1643; +exports.ER_SIGNAL_EXCEPTION = 1644; +exports.ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER = 1645; +exports.ER_SIGNAL_BAD_CONDITION_TYPE = 1646; +exports.WARN_COND_ITEM_TRUNCATED = 1647; +exports.ER_COND_ITEM_TOO_LONG = 1648; +exports.ER_UNKNOWN_LOCALE = 1649; +exports.ER_SLAVE_IGNORE_SERVER_IDS = 1650; +exports.ER_QUERY_CACHE_DISABLED = 1651; +exports.ER_SAME_NAME_PARTITION_FIELD = 1652; +exports.ER_PARTITION_COLUMN_LIST_ERROR = 1653; +exports.ER_WRONG_TYPE_COLUMN_VALUE_ERROR = 1654; +exports.ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR = 1655; +exports.ER_MAXVALUE_IN_VALUES_IN = 1656; +exports.ER_TOO_MANY_VALUES_ERROR = 1657; +exports.ER_ROW_SINGLE_PARTITION_FIELD_ERROR = 1658; +exports.ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD = 1659; +exports.ER_PARTITION_FIELDS_TOO_LONG = 1660; +exports.ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE = 1661; +exports.ER_BINLOG_ROW_MODE_AND_STMT_ENGINE = 1662; +exports.ER_BINLOG_UNSAFE_AND_STMT_ENGINE = 1663; +exports.ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE = 1664; +exports.ER_BINLOG_STMT_MODE_AND_ROW_ENGINE = 1665; +exports.ER_BINLOG_ROW_INJECTION_AND_STMT_MODE = 1666; +exports.ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1667; +exports.ER_BINLOG_UNSAFE_LIMIT = 1668; +exports.ER_BINLOG_UNSAFE_INSERT_DELAYED = 1669; +exports.ER_BINLOG_UNSAFE_SYSTEM_TABLE = 1670; +exports.ER_BINLOG_UNSAFE_AUTOINC_COLUMNS = 1671; +exports.ER_BINLOG_UNSAFE_UDF = 1672; +exports.ER_BINLOG_UNSAFE_SYSTEM_VARIABLE = 1673; +exports.ER_BINLOG_UNSAFE_SYSTEM_FUNCTION = 1674; +exports.ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS = 1675; +exports.ER_MESSAGE_AND_STATEMENT = 1676; +exports.ER_SLAVE_CONVERSION_FAILED = 1677; +exports.ER_SLAVE_CANT_CREATE_CONVERSION = 1678; +exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1679; +exports.ER_PATH_LENGTH = 1680; +exports.ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT = 1681; +exports.ER_WRONG_NATIVE_TABLE_STRUCTURE = 1682; +exports.ER_WRONG_PERFSCHEMA_USAGE = 1683; +exports.ER_WARN_I_S_SKIPPED_TABLE = 1684; +exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1685; +exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1686; +exports.ER_SPATIAL_MUST_HAVE_GEOM_COL = 1687; +exports.ER_TOO_LONG_INDEX_COMMENT = 1688; +exports.ER_LOCK_ABORTED = 1689; +exports.ER_DATA_OUT_OF_RANGE = 1690; +exports.ER_WRONG_SPVAR_TYPE_IN_LIMIT = 1691; +exports.ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1692; +exports.ER_BINLOG_UNSAFE_MIXED_STATEMENT = 1693; +exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1694; +exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1695; +exports.ER_FAILED_READ_FROM_PAR_FILE = 1696; +exports.ER_VALUES_IS_NOT_INT_TYPE_ERROR = 1697; +exports.ER_ACCESS_DENIED_NO_PASSWORD_ERROR = 1698; +exports.ER_SET_PASSWORD_AUTH_PLUGIN = 1699; +exports.ER_GRANT_PLUGIN_USER_EXISTS = 1700; +exports.ER_TRUNCATE_ILLEGAL_FK = 1701; +exports.ER_PLUGIN_IS_PERMANENT = 1702; +exports.ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN = 1703; +exports.ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX = 1704; +exports.ER_STMT_CACHE_FULL = 1705; +exports.ER_MULTI_UPDATE_KEY_CONFLICT = 1706; +exports.ER_TABLE_NEEDS_REBUILD = 1707; +exports.WARN_OPTION_BELOW_LIMIT = 1708; +exports.ER_INDEX_COLUMN_TOO_LONG = 1709; +exports.ER_ERROR_IN_TRIGGER_BODY = 1710; +exports.ER_ERROR_IN_UNKNOWN_TRIGGER_BODY = 1711; +exports.ER_INDEX_CORRUPT = 1712; +exports.ER_UNDO_RECORD_TOO_BIG = 1713; +exports.ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT = 1714; +exports.ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE = 1715; +exports.ER_BINLOG_UNSAFE_REPLACE_SELECT = 1716; +exports.ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT = 1717; +exports.ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT = 1718; +exports.ER_BINLOG_UNSAFE_UPDATE_IGNORE = 1719; +exports.ER_PLUGIN_NO_UNINSTALL = 1720; +exports.ER_PLUGIN_NO_INSTALL = 1721; +exports.ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT = 1722; +exports.ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC = 1723; +exports.ER_BINLOG_UNSAFE_INSERT_TWO_KEYS = 1724; +exports.ER_TABLE_IN_FK_CHECK = 1725; +exports.ER_UNSUPPORTED_ENGINE = 1726; +exports.ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST = 1727; +exports.ER_CANNOT_LOAD_FROM_TABLE_V2 = 1728; +exports.ER_MASTER_DELAY_VALUE_OUT_OF_RANGE = 1729; +exports.ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT = 1730; +exports.ER_PARTITION_EXCHANGE_DIFFERENT_OPTION = 1731; +exports.ER_PARTITION_EXCHANGE_PART_TABLE = 1732; +exports.ER_PARTITION_EXCHANGE_TEMP_TABLE = 1733; +exports.ER_PARTITION_INSTEAD_OF_SUBPARTITION = 1734; +exports.ER_UNKNOWN_PARTITION = 1735; +exports.ER_TABLES_DIFFERENT_METADATA = 1736; +exports.ER_ROW_DOES_NOT_MATCH_PARTITION = 1737; +exports.ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX = 1738; +exports.ER_WARN_INDEX_NOT_APPLICABLE = 1739; +exports.ER_PARTITION_EXCHANGE_FOREIGN_KEY = 1740; +exports.ER_NO_SUCH_KEY_VALUE = 1741; +exports.ER_RPL_INFO_DATA_TOO_LONG = 1742; +exports.ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE = 1743; +exports.ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE = 1744; +exports.ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX = 1745; +exports.ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT = 1746; +exports.ER_PARTITION_CLAUSE_ON_NONPARTITIONED = 1747; +exports.ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET = 1748; +exports.ER_NO_SUCH_PARTITION = 1749; +exports.ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE = 1750; +exports.ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE = 1751; +exports.ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE = 1752; +exports.ER_MTS_FEATURE_IS_NOT_SUPPORTED = 1753; +exports.ER_MTS_UPDATED_DBS_GREATER_MAX = 1754; +exports.ER_MTS_CANT_PARALLEL = 1755; +exports.ER_MTS_INCONSISTENT_DATA = 1756; +exports.ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING = 1757; +exports.ER_DA_INVALID_CONDITION_NUMBER = 1758; +exports.ER_INSECURE_PLAIN_TEXT = 1759; +exports.ER_INSECURE_CHANGE_MASTER = 1760; +exports.ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO = 1761; +exports.ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO = 1762; +exports.ER_SQLTHREAD_WITH_SECURE_SLAVE = 1763; +exports.ER_TABLE_HAS_NO_FT = 1764; +exports.ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER = 1765; +exports.ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION = 1766; +exports.ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST = 1767; +exports.ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION = 1768; +exports.ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION = 1769; +exports.ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL = 1770; +exports.ER_SKIPPING_LOGGED_TRANSACTION = 1771; +exports.ER_MALFORMED_GTID_SET_SPECIFICATION = 1772; +exports.ER_MALFORMED_GTID_SET_ENCODING = 1773; +exports.ER_MALFORMED_GTID_SPECIFICATION = 1774; +exports.ER_GNO_EXHAUSTED = 1775; +exports.ER_BAD_SLAVE_AUTO_POSITION = 1776; +exports.ER_AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF = 1777; +exports.ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET = 1778; +exports.ER_GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON = 1779; +exports.ER_GTID_MODE_REQUIRES_BINLOG = 1780; +exports.ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF = 1781; +exports.ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON = 1782; +exports.ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF = 1783; +exports.ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF = 1784; +exports.ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE = 1785; +exports.ER_GTID_UNSAFE_CREATE_SELECT = 1786; +exports.ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION = 1787; +exports.ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME = 1788; +exports.ER_MASTER_HAS_PURGED_REQUIRED_GTIDS = 1789; +exports.ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID = 1790; +exports.ER_UNKNOWN_EXPLAIN_FORMAT = 1791; +exports.ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION = 1792; +exports.ER_TOO_LONG_TABLE_PARTITION_COMMENT = 1793; +exports.ER_SLAVE_CONFIGURATION = 1794; +exports.ER_INNODB_FT_LIMIT = 1795; +exports.ER_INNODB_NO_FT_TEMP_TABLE = 1796; +exports.ER_INNODB_FT_WRONG_DOCID_COLUMN = 1797; +exports.ER_INNODB_FT_WRONG_DOCID_INDEX = 1798; +exports.ER_INNODB_ONLINE_LOG_TOO_BIG = 1799; +exports.ER_UNKNOWN_ALTER_ALGORITHM = 1800; +exports.ER_UNKNOWN_ALTER_LOCK = 1801; +exports.ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS = 1802; +exports.ER_MTS_RECOVERY_FAILURE = 1803; +exports.ER_MTS_RESET_WORKERS = 1804; +exports.ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 = 1805; +exports.ER_SLAVE_SILENT_RETRY_TRANSACTION = 1806; +exports.ER_DISCARD_FK_CHECKS_RUNNING = 1807; +exports.ER_TABLE_SCHEMA_MISMATCH = 1808; +exports.ER_TABLE_IN_SYSTEM_TABLESPACE = 1809; +exports.ER_IO_READ_ERROR = 1810; +exports.ER_IO_WRITE_ERROR = 1811; +exports.ER_TABLESPACE_MISSING = 1812; +exports.ER_TABLESPACE_EXISTS = 1813; +exports.ER_TABLESPACE_DISCARDED = 1814; +exports.ER_INTERNAL_ERROR = 1815; +exports.ER_INNODB_IMPORT_ERROR = 1816; +exports.ER_INNODB_INDEX_CORRUPT = 1817; +exports.ER_INVALID_YEAR_COLUMN_LENGTH = 1818; +exports.ER_NOT_VALID_PASSWORD = 1819; +exports.ER_MUST_CHANGE_PASSWORD = 1820; +exports.ER_FK_NO_INDEX_CHILD = 1821; +exports.ER_FK_NO_INDEX_PARENT = 1822; +exports.ER_FK_FAIL_ADD_SYSTEM = 1823; +exports.ER_FK_CANNOT_OPEN_PARENT = 1824; +exports.ER_FK_INCORRECT_OPTION = 1825; +exports.ER_FK_DUP_NAME = 1826; +exports.ER_PASSWORD_FORMAT = 1827; +exports.ER_FK_COLUMN_CANNOT_DROP = 1828; +exports.ER_FK_COLUMN_CANNOT_DROP_CHILD = 1829; +exports.ER_FK_COLUMN_NOT_NULL = 1830; +exports.ER_DUP_INDEX = 1831; +exports.ER_FK_COLUMN_CANNOT_CHANGE = 1832; +exports.ER_FK_COLUMN_CANNOT_CHANGE_CHILD = 1833; +exports.ER_FK_CANNOT_DELETE_PARENT = 1834; +exports.ER_MALFORMED_PACKET = 1835; +exports.ER_READ_ONLY_MODE = 1836; +exports.ER_GTID_NEXT_TYPE_UNDEFINED_GROUP = 1837; +exports.ER_VARIABLE_NOT_SETTABLE_IN_SP = 1838; +exports.ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF = 1839; +exports.ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY = 1840; +exports.ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY = 1841; +exports.ER_GTID_PURGED_WAS_CHANGED = 1842; +exports.ER_GTID_EXECUTED_WAS_CHANGED = 1843; +exports.ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES = 1844; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED = 1845; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON = 1846; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY = 1847; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION = 1848; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME = 1849; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE = 1850; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK = 1851; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE = 1852; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK = 1853; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC = 1854; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS = 1855; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS = 1856; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS = 1857; +exports.ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE = 1858; +exports.ER_DUP_UNKNOWN_IN_INDEX = 1859; +exports.ER_IDENT_CAUSES_TOO_LONG_PATH = 1860; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL = 1861; +exports.ER_MUST_CHANGE_PASSWORD_LOGIN = 1862; +exports.ER_ROW_IN_WRONG_PARTITION = 1863; +exports.ER_MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX = 1864; +exports.ER_INNODB_NO_FT_USES_PARSER = 1865; +exports.ER_BINLOG_LOGICAL_CORRUPTION = 1866; +exports.ER_WARN_PURGE_LOG_IN_USE = 1867; +exports.ER_WARN_PURGE_LOG_IS_ACTIVE = 1868; +exports.ER_AUTO_INCREMENT_CONFLICT = 1869; +exports.WARN_ON_BLOCKHOLE_IN_RBR = 1870; +exports.ER_SLAVE_MI_INIT_REPOSITORY = 1871; +exports.ER_SLAVE_RLI_INIT_REPOSITORY = 1872; +exports.ER_ACCESS_DENIED_CHANGE_USER_ERROR = 1873; +exports.ER_INNODB_READ_ONLY = 1874; +exports.ER_STOP_SLAVE_SQL_THREAD_TIMEOUT = 1875; +exports.ER_STOP_SLAVE_IO_THREAD_TIMEOUT = 1876; +exports.ER_TABLE_CORRUPT = 1877; +exports.ER_TEMP_FILE_WRITE_FAILURE = 1878; +exports.ER_INNODB_FT_AUX_NOT_HEX_ID = 1879; +exports.ER_OLD_TEMPORALS_UPGRADED = 1880; +exports.ER_INNODB_FORCED_RECOVERY = 1881; +exports.ER_AES_INVALID_IV = 1882; +exports.ER_PLUGIN_CANNOT_BE_UNINSTALLED = 1883; +exports.ER_GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_GTID_GROUP = 1884; +exports.ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER = 1885; +exports.ER_FILE_CORRUPT = 3000; +exports.ER_ERROR_ON_MASTER = 3001; +exports.ER_INCONSISTENT_ERROR = 3002; +exports.ER_STORAGE_ENGINE_NOT_LOADED = 3003; +exports.ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER = 3004; +exports.ER_WARN_LEGACY_SYNTAX_CONVERTED = 3005; +exports.ER_BINLOG_UNSAFE_FULLTEXT_PLUGIN = 3006; +exports.ER_CANNOT_DISCARD_TEMPORARY_TABLE = 3007; +exports.ER_FK_DEPTH_EXCEEDED = 3008; +exports.ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2 = 3009; +exports.ER_WARN_TRIGGER_DOESNT_HAVE_CREATED = 3010; +exports.ER_REFERENCED_TRG_DOES_NOT_EXIST = 3011; +exports.ER_EXPLAIN_NOT_SUPPORTED = 3012; +exports.ER_INVALID_FIELD_SIZE = 3013; +exports.ER_MISSING_HA_CREATE_OPTION = 3014; +exports.ER_ENGINE_OUT_OF_MEMORY = 3015; +exports.ER_PASSWORD_EXPIRE_ANONYMOUS_USER = 3016; +exports.ER_SLAVE_SQL_THREAD_MUST_STOP = 3017; +exports.ER_NO_FT_MATERIALIZED_SUBQUERY = 3018; +exports.ER_INNODB_UNDO_LOG_FULL = 3019; +exports.ER_INVALID_ARGUMENT_FOR_LOGARITHM = 3020; +exports.ER_SLAVE_CHANNEL_IO_THREAD_MUST_STOP = 3021; +exports.ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO = 3022; +exports.ER_WARN_ONLY_MASTER_LOG_FILE_NO_POS = 3023; +exports.ER_QUERY_TIMEOUT = 3024; +exports.ER_NON_RO_SELECT_DISABLE_TIMER = 3025; +exports.ER_DUP_LIST_ENTRY = 3026; +exports.ER_SQL_MODE_NO_EFFECT = 3027; +exports.ER_AGGREGATE_ORDER_FOR_UNION = 3028; +exports.ER_AGGREGATE_ORDER_NON_AGG_QUERY = 3029; +exports.ER_SLAVE_WORKER_STOPPED_PREVIOUS_THD_ERROR = 3030; +exports.ER_DONT_SUPPORT_SLAVE_PRESERVE_COMMIT_ORDER = 3031; +exports.ER_SERVER_OFFLINE_MODE = 3032; +exports.ER_GIS_DIFFERENT_SRIDS = 3033; +exports.ER_GIS_UNSUPPORTED_ARGUMENT = 3034; +exports.ER_GIS_UNKNOWN_ERROR = 3035; +exports.ER_GIS_UNKNOWN_EXCEPTION = 3036; +exports.ER_GIS_INVALID_DATA = 3037; +exports.ER_BOOST_GEOMETRY_EMPTY_INPUT_EXCEPTION = 3038; +exports.ER_BOOST_GEOMETRY_CENTROID_EXCEPTION = 3039; +exports.ER_BOOST_GEOMETRY_OVERLAY_INVALID_INPUT_EXCEPTION = 3040; +exports.ER_BOOST_GEOMETRY_TURN_INFO_EXCEPTION = 3041; +exports.ER_BOOST_GEOMETRY_SELF_INTERSECTION_POINT_EXCEPTION = 3042; +exports.ER_BOOST_GEOMETRY_UNKNOWN_EXCEPTION = 3043; +exports.ER_STD_BAD_ALLOC_ERROR = 3044; +exports.ER_STD_DOMAIN_ERROR = 3045; +exports.ER_STD_LENGTH_ERROR = 3046; +exports.ER_STD_INVALID_ARGUMENT = 3047; +exports.ER_STD_OUT_OF_RANGE_ERROR = 3048; +exports.ER_STD_OVERFLOW_ERROR = 3049; +exports.ER_STD_RANGE_ERROR = 3050; +exports.ER_STD_UNDERFLOW_ERROR = 3051; +exports.ER_STD_LOGIC_ERROR = 3052; +exports.ER_STD_RUNTIME_ERROR = 3053; +exports.ER_STD_UNKNOWN_EXCEPTION = 3054; +exports.ER_GIS_DATA_WRONG_ENDIANESS = 3055; +exports.ER_CHANGE_MASTER_PASSWORD_LENGTH = 3056; +exports.ER_USER_LOCK_WRONG_NAME = 3057; +exports.ER_USER_LOCK_DEADLOCK = 3058; +exports.ER_REPLACE_INACCESSIBLE_ROWS = 3059; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_GIS = 3060; +exports.ER_ILLEGAL_USER_VAR = 3061; +exports.ER_GTID_MODE_OFF = 3062; +exports.ER_UNSUPPORTED_BY_REPLICATION_THREAD = 3063; +exports.ER_INCORRECT_TYPE = 3064; +exports.ER_FIELD_IN_ORDER_NOT_SELECT = 3065; +exports.ER_AGGREGATE_IN_ORDER_NOT_SELECT = 3066; +exports.ER_INVALID_RPL_WILD_TABLE_FILTER_PATTERN = 3067; +exports.ER_NET_OK_PACKET_TOO_LARGE = 3068; +exports.ER_INVALID_JSON_DATA = 3069; +exports.ER_INVALID_GEOJSON_MISSING_MEMBER = 3070; +exports.ER_INVALID_GEOJSON_WRONG_TYPE = 3071; +exports.ER_INVALID_GEOJSON_UNSPECIFIED = 3072; +exports.ER_DIMENSION_UNSUPPORTED = 3073; +exports.ER_SLAVE_CHANNEL_DOES_NOT_EXIST = 3074; +exports.ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT = 3075; +exports.ER_SLAVE_CHANNEL_NAME_INVALID_OR_TOO_LONG = 3076; +exports.ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORY = 3077; +exports.ER_SLAVE_CHANNEL_DELETE = 3078; +exports.ER_SLAVE_MULTIPLE_CHANNELS_CMD = 3079; +exports.ER_SLAVE_MAX_CHANNELS_EXCEEDED = 3080; +exports.ER_SLAVE_CHANNEL_MUST_STOP = 3081; +exports.ER_SLAVE_CHANNEL_NOT_RUNNING = 3082; +exports.ER_SLAVE_CHANNEL_WAS_RUNNING = 3083; +exports.ER_SLAVE_CHANNEL_WAS_NOT_RUNNING = 3084; +exports.ER_SLAVE_CHANNEL_SQL_THREAD_MUST_STOP = 3085; +exports.ER_SLAVE_CHANNEL_SQL_SKIP_COUNTER = 3086; +exports.ER_WRONG_FIELD_WITH_GROUP_V2 = 3087; +exports.ER_MIX_OF_GROUP_FUNC_AND_FIELDS_V2 = 3088; +exports.ER_WARN_DEPRECATED_SYSVAR_UPDATE = 3089; +exports.ER_WARN_DEPRECATED_SQLMODE = 3090; +exports.ER_CANNOT_LOG_PARTIAL_DROP_DATABASE_WITH_GTID = 3091; +exports.ER_GROUP_REPLICATION_CONFIGURATION = 3092; +exports.ER_GROUP_REPLICATION_RUNNING = 3093; +exports.ER_GROUP_REPLICATION_APPLIER_INIT_ERROR = 3094; +exports.ER_GROUP_REPLICATION_STOP_APPLIER_THREAD_TIMEOUT = 3095; +exports.ER_GROUP_REPLICATION_COMMUNICATION_LAYER_SESSION_ERROR = 3096; +exports.ER_GROUP_REPLICATION_COMMUNICATION_LAYER_JOIN_ERROR = 3097; +exports.ER_BEFORE_DML_VALIDATION_ERROR = 3098; +exports.ER_PREVENTS_VARIABLE_WITHOUT_RBR = 3099; +exports.ER_RUN_HOOK_ERROR = 3100; +exports.ER_TRANSACTION_ROLLBACK_DURING_COMMIT = 3101; +exports.ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED = 3102; +exports.ER_UNSUPPORTED_ALTER_INPLACE_ON_VIRTUAL_COLUMN = 3103; +exports.ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN = 3104; +exports.ER_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN = 3105; +exports.ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN = 3106; +exports.ER_GENERATED_COLUMN_NON_PRIOR = 3107; +exports.ER_DEPENDENT_BY_GENERATED_COLUMN = 3108; +exports.ER_GENERATED_COLUMN_REF_AUTO_INC = 3109; +exports.ER_FEATURE_NOT_AVAILABLE = 3110; +exports.ER_CANT_SET_GTID_MODE = 3111; +exports.ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF = 3112; +exports.ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION = 3113; +exports.ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON = 3114; +exports.ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF = 3115; +exports.ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS = 3116; +exports.ER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS = 3117; +exports.ER_ACCOUNT_HAS_BEEN_LOCKED = 3118; +exports.ER_WRONG_TABLESPACE_NAME = 3119; +exports.ER_TABLESPACE_IS_NOT_EMPTY = 3120; +exports.ER_WRONG_FILE_NAME = 3121; +exports.ER_BOOST_GEOMETRY_INCONSISTENT_TURNS_EXCEPTION = 3122; +exports.ER_WARN_OPTIMIZER_HINT_SYNTAX_ERROR = 3123; +exports.ER_WARN_BAD_MAX_EXECUTION_TIME = 3124; +exports.ER_WARN_UNSUPPORTED_MAX_EXECUTION_TIME = 3125; +exports.ER_WARN_CONFLICTING_HINT = 3126; +exports.ER_WARN_UNKNOWN_QB_NAME = 3127; +exports.ER_UNRESOLVED_HINT_NAME = 3128; +exports.ER_WARN_ON_MODIFYING_GTID_EXECUTED_TABLE = 3129; +exports.ER_PLUGGABLE_PROTOCOL_COMMAND_NOT_SUPPORTED = 3130; +exports.ER_LOCKING_SERVICE_WRONG_NAME = 3131; +exports.ER_LOCKING_SERVICE_DEADLOCK = 3132; +exports.ER_LOCKING_SERVICE_TIMEOUT = 3133; +exports.ER_GIS_MAX_POINTS_IN_GEOMETRY_OVERFLOWED = 3134; +exports.ER_SQL_MODE_MERGED = 3135; +exports.ER_VTOKEN_PLUGIN_TOKEN_MISMATCH = 3136; +exports.ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND = 3137; +exports.ER_CANT_SET_VARIABLE_WHEN_OWNING_GTID = 3138; +exports.ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED = 3139; +exports.ER_INVALID_JSON_TEXT = 3140; +exports.ER_INVALID_JSON_TEXT_IN_PARAM = 3141; +exports.ER_INVALID_JSON_BINARY_DATA = 3142; +exports.ER_INVALID_JSON_PATH = 3143; +exports.ER_INVALID_JSON_CHARSET = 3144; +exports.ER_INVALID_JSON_CHARSET_IN_FUNCTION = 3145; +exports.ER_INVALID_TYPE_FOR_JSON = 3146; +exports.ER_INVALID_CAST_TO_JSON = 3147; +exports.ER_INVALID_JSON_PATH_CHARSET = 3148; +exports.ER_INVALID_JSON_PATH_WILDCARD = 3149; +exports.ER_JSON_VALUE_TOO_BIG = 3150; +exports.ER_JSON_KEY_TOO_BIG = 3151; +exports.ER_JSON_USED_AS_KEY = 3152; +exports.ER_JSON_VACUOUS_PATH = 3153; +exports.ER_JSON_BAD_ONE_OR_ALL_ARG = 3154; +exports.ER_NUMERIC_JSON_VALUE_OUT_OF_RANGE = 3155; +exports.ER_INVALID_JSON_VALUE_FOR_CAST = 3156; +exports.ER_JSON_DOCUMENT_TOO_DEEP = 3157; +exports.ER_JSON_DOCUMENT_NULL_KEY = 3158; +exports.ER_SECURE_TRANSPORT_REQUIRED = 3159; +exports.ER_NO_SECURE_TRANSPORTS_CONFIGURED = 3160; +exports.ER_DISABLED_STORAGE_ENGINE = 3161; +exports.ER_USER_DOES_NOT_EXIST = 3162; +exports.ER_USER_ALREADY_EXISTS = 3163; +exports.ER_AUDIT_API_ABORT = 3164; +exports.ER_INVALID_JSON_PATH_ARRAY_CELL = 3165; +exports.ER_BUFPOOL_RESIZE_INPROGRESS = 3166; +exports.ER_FEATURE_DISABLED_SEE_DOC = 3167; +exports.ER_SERVER_ISNT_AVAILABLE = 3168; +exports.ER_SESSION_WAS_KILLED = 3169; +exports.ER_CAPACITY_EXCEEDED = 3170; +exports.ER_CAPACITY_EXCEEDED_IN_RANGE_OPTIMIZER = 3171; +exports.ER_TABLE_NEEDS_UPG_PART = 3172; +exports.ER_CANT_WAIT_FOR_EXECUTED_GTID_SET_WHILE_OWNING_A_GTID = 3173; +exports.ER_CANNOT_ADD_FOREIGN_BASE_COL_VIRTUAL = 3174; +exports.ER_CANNOT_CREATE_VIRTUAL_INDEX_CONSTRAINT = 3175; +exports.ER_ERROR_ON_MODIFYING_GTID_EXECUTED_TABLE = 3176; +exports.ER_LOCK_REFUSED_BY_ENGINE = 3177; +exports.ER_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN = 3178; +exports.ER_MASTER_KEY_ROTATION_NOT_SUPPORTED_BY_SE = 3179; +exports.ER_MASTER_KEY_ROTATION_ERROR_BY_SE = 3180; +exports.ER_MASTER_KEY_ROTATION_BINLOG_FAILED = 3181; +exports.ER_MASTER_KEY_ROTATION_SE_UNAVAILABLE = 3182; +exports.ER_TABLESPACE_CANNOT_ENCRYPT = 3183; +exports.ER_INVALID_ENCRYPTION_OPTION = 3184; +exports.ER_CANNOT_FIND_KEY_IN_KEYRING = 3185; +exports.ER_CAPACITY_EXCEEDED_IN_PARSER = 3186; +exports.ER_UNSUPPORTED_ALTER_ENCRYPTION_INPLACE = 3187; +exports.ER_KEYRING_UDF_KEYRING_SERVICE_ERROR = 3188; +exports.ER_USER_COLUMN_OLD_LENGTH = 3189; +exports.ER_CANT_RESET_MASTER = 3190; +exports.ER_GROUP_REPLICATION_MAX_GROUP_SIZE = 3191; +exports.ER_CANNOT_ADD_FOREIGN_BASE_COL_STORED = 3192; +exports.ER_TABLE_REFERENCED = 3193; +exports.ER_PARTITION_ENGINE_DEPRECATED_FOR_TABLE = 3194; +exports.ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO = 3195; +exports.ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID = 3196; +exports.ER_XA_RETRY = 3197; +exports.ER_KEYRING_AWS_UDF_AWS_KMS_ERROR = 3198; +exports.ER_BINLOG_UNSAFE_XA = 3199; +exports.ER_UDF_ERROR = 3200; +exports.ER_KEYRING_MIGRATION_FAILURE = 3201; +exports.ER_KEYRING_ACCESS_DENIED_ERROR = 3202; +exports.ER_KEYRING_MIGRATION_STATUS = 3203; + +// Lookup-by-number table +exports[1] = 'EE_CANTCREATEFILE'; +exports[2] = 'EE_READ'; +exports[3] = 'EE_WRITE'; +exports[4] = 'EE_BADCLOSE'; +exports[5] = 'EE_OUTOFMEMORY'; +exports[6] = 'EE_DELETE'; +exports[7] = 'EE_LINK'; +exports[9] = 'EE_EOFERR'; +exports[10] = 'EE_CANTLOCK'; +exports[11] = 'EE_CANTUNLOCK'; +exports[12] = 'EE_DIR'; +exports[13] = 'EE_STAT'; +exports[14] = 'EE_CANT_CHSIZE'; +exports[15] = 'EE_CANT_OPEN_STREAM'; +exports[16] = 'EE_GETWD'; +exports[17] = 'EE_SETWD'; +exports[18] = 'EE_LINK_WARNING'; +exports[19] = 'EE_OPEN_WARNING'; +exports[20] = 'EE_DISK_FULL'; +exports[21] = 'EE_CANT_MKDIR'; +exports[22] = 'EE_UNKNOWN_CHARSET'; +exports[23] = 'EE_OUT_OF_FILERESOURCES'; +exports[24] = 'EE_CANT_READLINK'; +exports[25] = 'EE_CANT_SYMLINK'; +exports[26] = 'EE_REALPATH'; +exports[27] = 'EE_SYNC'; +exports[28] = 'EE_UNKNOWN_COLLATION'; +exports[29] = 'EE_FILENOTFOUND'; +exports[30] = 'EE_FILE_NOT_CLOSED'; +exports[31] = 'EE_CHANGE_OWNERSHIP'; +exports[32] = 'EE_CHANGE_PERMISSIONS'; +exports[33] = 'EE_CANT_SEEK'; +exports[34] = 'EE_CAPACITY_EXCEEDED'; +exports[120] = 'HA_ERR_KEY_NOT_FOUND'; +exports[121] = 'HA_ERR_FOUND_DUPP_KEY'; +exports[122] = 'HA_ERR_INTERNAL_ERROR'; +exports[123] = 'HA_ERR_RECORD_CHANGED'; +exports[124] = 'HA_ERR_WRONG_INDEX'; +exports[126] = 'HA_ERR_CRASHED'; +exports[127] = 'HA_ERR_WRONG_IN_RECORD'; +exports[128] = 'HA_ERR_OUT_OF_MEM'; +exports[130] = 'HA_ERR_NOT_A_TABLE'; +exports[131] = 'HA_ERR_WRONG_COMMAND'; +exports[132] = 'HA_ERR_OLD_FILE'; +exports[133] = 'HA_ERR_NO_ACTIVE_RECORD'; +exports[134] = 'HA_ERR_RECORD_DELETED'; +exports[135] = 'HA_ERR_RECORD_FILE_FULL'; +exports[136] = 'HA_ERR_INDEX_FILE_FULL'; +exports[137] = 'HA_ERR_END_OF_FILE'; +exports[138] = 'HA_ERR_UNSUPPORTED'; +exports[139] = 'HA_ERR_TOO_BIG_ROW'; +exports[140] = 'HA_WRONG_CREATE_OPTION'; +exports[141] = 'HA_ERR_FOUND_DUPP_UNIQUE'; +exports[142] = 'HA_ERR_UNKNOWN_CHARSET'; +exports[143] = 'HA_ERR_WRONG_MRG_TABLE_DEF'; +exports[144] = 'HA_ERR_CRASHED_ON_REPAIR'; +exports[145] = 'HA_ERR_CRASHED_ON_USAGE'; +exports[146] = 'HA_ERR_LOCK_WAIT_TIMEOUT'; +exports[147] = 'HA_ERR_LOCK_TABLE_FULL'; +exports[148] = 'HA_ERR_READ_ONLY_TRANSACTION'; +exports[149] = 'HA_ERR_LOCK_DEADLOCK'; +exports[150] = 'HA_ERR_CANNOT_ADD_FOREIGN'; +exports[151] = 'HA_ERR_NO_REFERENCED_ROW'; +exports[152] = 'HA_ERR_ROW_IS_REFERENCED'; +exports[153] = 'HA_ERR_NO_SAVEPOINT'; +exports[154] = 'HA_ERR_NON_UNIQUE_BLOCK_SIZE'; +exports[155] = 'HA_ERR_NO_SUCH_TABLE'; +exports[156] = 'HA_ERR_TABLE_EXIST'; +exports[157] = 'HA_ERR_NO_CONNECTION'; +exports[158] = 'HA_ERR_NULL_IN_SPATIAL'; +exports[159] = 'HA_ERR_TABLE_DEF_CHANGED'; +exports[160] = 'HA_ERR_NO_PARTITION_FOUND'; +exports[161] = 'HA_ERR_RBR_LOGGING_FAILED'; +exports[162] = 'HA_ERR_DROP_INDEX_FK'; +exports[163] = 'HA_ERR_FOREIGN_DUPLICATE_KEY'; +exports[164] = 'HA_ERR_TABLE_NEEDS_UPGRADE'; +exports[165] = 'HA_ERR_TABLE_READONLY'; +exports[166] = 'HA_ERR_AUTOINC_READ_FAILED'; +exports[167] = 'HA_ERR_AUTOINC_ERANGE'; +exports[168] = 'HA_ERR_GENERIC'; +exports[169] = 'HA_ERR_RECORD_IS_THE_SAME'; +exports[170] = 'HA_ERR_LOGGING_IMPOSSIBLE'; +exports[171] = 'HA_ERR_CORRUPT_EVENT'; +exports[172] = 'HA_ERR_NEW_FILE'; +exports[173] = 'HA_ERR_ROWS_EVENT_APPLY'; +exports[174] = 'HA_ERR_INITIALIZATION'; +exports[175] = 'HA_ERR_FILE_TOO_SHORT'; +exports[176] = 'HA_ERR_WRONG_CRC'; +exports[177] = 'HA_ERR_TOO_MANY_CONCURRENT_TRXS'; +exports[178] = 'HA_ERR_NOT_IN_LOCK_PARTITIONS'; +exports[179] = 'HA_ERR_INDEX_COL_TOO_LONG'; +exports[180] = 'HA_ERR_INDEX_CORRUPT'; +exports[181] = 'HA_ERR_UNDO_REC_TOO_BIG'; +exports[182] = 'HA_FTS_INVALID_DOCID'; +exports[183] = 'HA_ERR_TABLE_IN_FK_CHECK'; +exports[184] = 'HA_ERR_TABLESPACE_EXISTS'; +exports[185] = 'HA_ERR_TOO_MANY_FIELDS'; +exports[186] = 'HA_ERR_ROW_IN_WRONG_PARTITION'; +exports[187] = 'HA_ERR_INNODB_READ_ONLY'; +exports[188] = 'HA_ERR_FTS_EXCEED_RESULT_CACHE_LIMIT'; +exports[189] = 'HA_ERR_TEMP_FILE_WRITE_FAILURE'; +exports[190] = 'HA_ERR_INNODB_FORCED_RECOVERY'; +exports[191] = 'HA_ERR_FTS_TOO_MANY_WORDS_IN_PHRASE'; +exports[192] = 'HA_ERR_FK_DEPTH_EXCEEDED'; +exports[193] = 'HA_MISSING_CREATE_OPTION'; +exports[194] = 'HA_ERR_SE_OUT_OF_MEMORY'; +exports[195] = 'HA_ERR_TABLE_CORRUPT'; +exports[196] = 'HA_ERR_QUERY_INTERRUPTED'; +exports[197] = 'HA_ERR_TABLESPACE_MISSING'; +exports[198] = 'HA_ERR_TABLESPACE_IS_NOT_EMPTY'; +exports[199] = 'HA_ERR_WRONG_FILE_NAME'; +exports[200] = 'HA_ERR_NOT_ALLOWED_COMMAND'; +exports[201] = 'HA_ERR_COMPUTE_FAILED'; +exports[1000] = 'ER_HASHCHK'; +exports[1001] = 'ER_NISAMCHK'; +exports[1002] = 'ER_NO'; +exports[1003] = 'ER_YES'; +exports[1004] = 'ER_CANT_CREATE_FILE'; +exports[1005] = 'ER_CANT_CREATE_TABLE'; +exports[1006] = 'ER_CANT_CREATE_DB'; +exports[1007] = 'ER_DB_CREATE_EXISTS'; +exports[1008] = 'ER_DB_DROP_EXISTS'; +exports[1009] = 'ER_DB_DROP_DELETE'; +exports[1010] = 'ER_DB_DROP_RMDIR'; +exports[1011] = 'ER_CANT_DELETE_FILE'; +exports[1012] = 'ER_CANT_FIND_SYSTEM_REC'; +exports[1013] = 'ER_CANT_GET_STAT'; +exports[1014] = 'ER_CANT_GET_WD'; +exports[1015] = 'ER_CANT_LOCK'; +exports[1016] = 'ER_CANT_OPEN_FILE'; +exports[1017] = 'ER_FILE_NOT_FOUND'; +exports[1018] = 'ER_CANT_READ_DIR'; +exports[1019] = 'ER_CANT_SET_WD'; +exports[1020] = 'ER_CHECKREAD'; +exports[1021] = 'ER_DISK_FULL'; +exports[1022] = 'ER_DUP_KEY'; +exports[1023] = 'ER_ERROR_ON_CLOSE'; +exports[1024] = 'ER_ERROR_ON_READ'; +exports[1025] = 'ER_ERROR_ON_RENAME'; +exports[1026] = 'ER_ERROR_ON_WRITE'; +exports[1027] = 'ER_FILE_USED'; +exports[1028] = 'ER_FILSORT_ABORT'; +exports[1029] = 'ER_FORM_NOT_FOUND'; +exports[1030] = 'ER_GET_ERRNO'; +exports[1031] = 'ER_ILLEGAL_HA'; +exports[1032] = 'ER_KEY_NOT_FOUND'; +exports[1033] = 'ER_NOT_FORM_FILE'; +exports[1034] = 'ER_NOT_KEYFILE'; +exports[1035] = 'ER_OLD_KEYFILE'; +exports[1036] = 'ER_OPEN_AS_READONLY'; +exports[1037] = 'ER_OUTOFMEMORY'; +exports[1038] = 'ER_OUT_OF_SORTMEMORY'; +exports[1039] = 'ER_UNEXPECTED_EOF'; +exports[1040] = 'ER_CON_COUNT_ERROR'; +exports[1041] = 'ER_OUT_OF_RESOURCES'; +exports[1042] = 'ER_BAD_HOST_ERROR'; +exports[1043] = 'ER_HANDSHAKE_ERROR'; +exports[1044] = 'ER_DBACCESS_DENIED_ERROR'; +exports[1045] = 'ER_ACCESS_DENIED_ERROR'; +exports[1046] = 'ER_NO_DB_ERROR'; +exports[1047] = 'ER_UNKNOWN_COM_ERROR'; +exports[1048] = 'ER_BAD_NULL_ERROR'; +exports[1049] = 'ER_BAD_DB_ERROR'; +exports[1050] = 'ER_TABLE_EXISTS_ERROR'; +exports[1051] = 'ER_BAD_TABLE_ERROR'; +exports[1052] = 'ER_NON_UNIQ_ERROR'; +exports[1053] = 'ER_SERVER_SHUTDOWN'; +exports[1054] = 'ER_BAD_FIELD_ERROR'; +exports[1055] = 'ER_WRONG_FIELD_WITH_GROUP'; +exports[1056] = 'ER_WRONG_GROUP_FIELD'; +exports[1057] = 'ER_WRONG_SUM_SELECT'; +exports[1058] = 'ER_WRONG_VALUE_COUNT'; +exports[1059] = 'ER_TOO_LONG_IDENT'; +exports[1060] = 'ER_DUP_FIELDNAME'; +exports[1061] = 'ER_DUP_KEYNAME'; +exports[1062] = 'ER_DUP_ENTRY'; +exports[1063] = 'ER_WRONG_FIELD_SPEC'; +exports[1064] = 'ER_PARSE_ERROR'; +exports[1065] = 'ER_EMPTY_QUERY'; +exports[1066] = 'ER_NONUNIQ_TABLE'; +exports[1067] = 'ER_INVALID_DEFAULT'; +exports[1068] = 'ER_MULTIPLE_PRI_KEY'; +exports[1069] = 'ER_TOO_MANY_KEYS'; +exports[1070] = 'ER_TOO_MANY_KEY_PARTS'; +exports[1071] = 'ER_TOO_LONG_KEY'; +exports[1072] = 'ER_KEY_COLUMN_DOES_NOT_EXITS'; +exports[1073] = 'ER_BLOB_USED_AS_KEY'; +exports[1074] = 'ER_TOO_BIG_FIELDLENGTH'; +exports[1075] = 'ER_WRONG_AUTO_KEY'; +exports[1076] = 'ER_READY'; +exports[1077] = 'ER_NORMAL_SHUTDOWN'; +exports[1078] = 'ER_GOT_SIGNAL'; +exports[1079] = 'ER_SHUTDOWN_COMPLETE'; +exports[1080] = 'ER_FORCING_CLOSE'; +exports[1081] = 'ER_IPSOCK_ERROR'; +exports[1082] = 'ER_NO_SUCH_INDEX'; +exports[1083] = 'ER_WRONG_FIELD_TERMINATORS'; +exports[1084] = 'ER_BLOBS_AND_NO_TERMINATED'; +exports[1085] = 'ER_TEXTFILE_NOT_READABLE'; +exports[1086] = 'ER_FILE_EXISTS_ERROR'; +exports[1087] = 'ER_LOAD_INFO'; +exports[1088] = 'ER_ALTER_INFO'; +exports[1089] = 'ER_WRONG_SUB_KEY'; +exports[1090] = 'ER_CANT_REMOVE_ALL_FIELDS'; +exports[1091] = 'ER_CANT_DROP_FIELD_OR_KEY'; +exports[1092] = 'ER_INSERT_INFO'; +exports[1093] = 'ER_UPDATE_TABLE_USED'; +exports[1094] = 'ER_NO_SUCH_THREAD'; +exports[1095] = 'ER_KILL_DENIED_ERROR'; +exports[1096] = 'ER_NO_TABLES_USED'; +exports[1097] = 'ER_TOO_BIG_SET'; +exports[1098] = 'ER_NO_UNIQUE_LOGFILE'; +exports[1099] = 'ER_TABLE_NOT_LOCKED_FOR_WRITE'; +exports[1100] = 'ER_TABLE_NOT_LOCKED'; +exports[1101] = 'ER_BLOB_CANT_HAVE_DEFAULT'; +exports[1102] = 'ER_WRONG_DB_NAME'; +exports[1103] = 'ER_WRONG_TABLE_NAME'; +exports[1104] = 'ER_TOO_BIG_SELECT'; +exports[1105] = 'ER_UNKNOWN_ERROR'; +exports[1106] = 'ER_UNKNOWN_PROCEDURE'; +exports[1107] = 'ER_WRONG_PARAMCOUNT_TO_PROCEDURE'; +exports[1108] = 'ER_WRONG_PARAMETERS_TO_PROCEDURE'; +exports[1109] = 'ER_UNKNOWN_TABLE'; +exports[1110] = 'ER_FIELD_SPECIFIED_TWICE'; +exports[1111] = 'ER_INVALID_GROUP_FUNC_USE'; +exports[1112] = 'ER_UNSUPPORTED_EXTENSION'; +exports[1113] = 'ER_TABLE_MUST_HAVE_COLUMNS'; +exports[1114] = 'ER_RECORD_FILE_FULL'; +exports[1115] = 'ER_UNKNOWN_CHARACTER_SET'; +exports[1116] = 'ER_TOO_MANY_TABLES'; +exports[1117] = 'ER_TOO_MANY_FIELDS'; +exports[1118] = 'ER_TOO_BIG_ROWSIZE'; +exports[1119] = 'ER_STACK_OVERRUN'; +exports[1120] = 'ER_WRONG_OUTER_JOIN'; +exports[1121] = 'ER_NULL_COLUMN_IN_INDEX'; +exports[1122] = 'ER_CANT_FIND_UDF'; +exports[1123] = 'ER_CANT_INITIALIZE_UDF'; +exports[1124] = 'ER_UDF_NO_PATHS'; +exports[1125] = 'ER_UDF_EXISTS'; +exports[1126] = 'ER_CANT_OPEN_LIBRARY'; +exports[1127] = 'ER_CANT_FIND_DL_ENTRY'; +exports[1128] = 'ER_FUNCTION_NOT_DEFINED'; +exports[1129] = 'ER_HOST_IS_BLOCKED'; +exports[1130] = 'ER_HOST_NOT_PRIVILEGED'; +exports[1131] = 'ER_PASSWORD_ANONYMOUS_USER'; +exports[1132] = 'ER_PASSWORD_NOT_ALLOWED'; +exports[1133] = 'ER_PASSWORD_NO_MATCH'; +exports[1134] = 'ER_UPDATE_INFO'; +exports[1135] = 'ER_CANT_CREATE_THREAD'; +exports[1136] = 'ER_WRONG_VALUE_COUNT_ON_ROW'; +exports[1137] = 'ER_CANT_REOPEN_TABLE'; +exports[1138] = 'ER_INVALID_USE_OF_NULL'; +exports[1139] = 'ER_REGEXP_ERROR'; +exports[1140] = 'ER_MIX_OF_GROUP_FUNC_AND_FIELDS'; +exports[1141] = 'ER_NONEXISTING_GRANT'; +exports[1142] = 'ER_TABLEACCESS_DENIED_ERROR'; +exports[1143] = 'ER_COLUMNACCESS_DENIED_ERROR'; +exports[1144] = 'ER_ILLEGAL_GRANT_FOR_TABLE'; +exports[1145] = 'ER_GRANT_WRONG_HOST_OR_USER'; +exports[1146] = 'ER_NO_SUCH_TABLE'; +exports[1147] = 'ER_NONEXISTING_TABLE_GRANT'; +exports[1148] = 'ER_NOT_ALLOWED_COMMAND'; +exports[1149] = 'ER_SYNTAX_ERROR'; +exports[1150] = 'ER_DELAYED_CANT_CHANGE_LOCK'; +exports[1151] = 'ER_TOO_MANY_DELAYED_THREADS'; +exports[1152] = 'ER_ABORTING_CONNECTION'; +exports[1153] = 'ER_NET_PACKET_TOO_LARGE'; +exports[1154] = 'ER_NET_READ_ERROR_FROM_PIPE'; +exports[1155] = 'ER_NET_FCNTL_ERROR'; +exports[1156] = 'ER_NET_PACKETS_OUT_OF_ORDER'; +exports[1157] = 'ER_NET_UNCOMPRESS_ERROR'; +exports[1158] = 'ER_NET_READ_ERROR'; +exports[1159] = 'ER_NET_READ_INTERRUPTED'; +exports[1160] = 'ER_NET_ERROR_ON_WRITE'; +exports[1161] = 'ER_NET_WRITE_INTERRUPTED'; +exports[1162] = 'ER_TOO_LONG_STRING'; +exports[1163] = 'ER_TABLE_CANT_HANDLE_BLOB'; +exports[1164] = 'ER_TABLE_CANT_HANDLE_AUTO_INCREMENT'; +exports[1165] = 'ER_DELAYED_INSERT_TABLE_LOCKED'; +exports[1166] = 'ER_WRONG_COLUMN_NAME'; +exports[1167] = 'ER_WRONG_KEY_COLUMN'; +exports[1168] = 'ER_WRONG_MRG_TABLE'; +exports[1169] = 'ER_DUP_UNIQUE'; +exports[1170] = 'ER_BLOB_KEY_WITHOUT_LENGTH'; +exports[1171] = 'ER_PRIMARY_CANT_HAVE_NULL'; +exports[1172] = 'ER_TOO_MANY_ROWS'; +exports[1173] = 'ER_REQUIRES_PRIMARY_KEY'; +exports[1174] = 'ER_NO_RAID_COMPILED'; +exports[1175] = 'ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE'; +exports[1176] = 'ER_KEY_DOES_NOT_EXITS'; +exports[1177] = 'ER_CHECK_NO_SUCH_TABLE'; +exports[1178] = 'ER_CHECK_NOT_IMPLEMENTED'; +exports[1179] = 'ER_CANT_DO_THIS_DURING_AN_TRANSACTION'; +exports[1180] = 'ER_ERROR_DURING_COMMIT'; +exports[1181] = 'ER_ERROR_DURING_ROLLBACK'; +exports[1182] = 'ER_ERROR_DURING_FLUSH_LOGS'; +exports[1183] = 'ER_ERROR_DURING_CHECKPOINT'; +exports[1184] = 'ER_NEW_ABORTING_CONNECTION'; +exports[1185] = 'ER_DUMP_NOT_IMPLEMENTED'; +exports[1186] = 'ER_FLUSH_MASTER_BINLOG_CLOSED'; +exports[1187] = 'ER_INDEX_REBUILD'; +exports[1188] = 'ER_MASTER'; +exports[1189] = 'ER_MASTER_NET_READ'; +exports[1190] = 'ER_MASTER_NET_WRITE'; +exports[1191] = 'ER_FT_MATCHING_KEY_NOT_FOUND'; +exports[1192] = 'ER_LOCK_OR_ACTIVE_TRANSACTION'; +exports[1193] = 'ER_UNKNOWN_SYSTEM_VARIABLE'; +exports[1194] = 'ER_CRASHED_ON_USAGE'; +exports[1195] = 'ER_CRASHED_ON_REPAIR'; +exports[1196] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK'; +exports[1197] = 'ER_TRANS_CACHE_FULL'; +exports[1198] = 'ER_SLAVE_MUST_STOP'; +exports[1199] = 'ER_SLAVE_NOT_RUNNING'; +exports[1200] = 'ER_BAD_SLAVE'; +exports[1201] = 'ER_MASTER_INFO'; +exports[1202] = 'ER_SLAVE_THREAD'; +exports[1203] = 'ER_TOO_MANY_USER_CONNECTIONS'; +exports[1204] = 'ER_SET_CONSTANTS_ONLY'; +exports[1205] = 'ER_LOCK_WAIT_TIMEOUT'; +exports[1206] = 'ER_LOCK_TABLE_FULL'; +exports[1207] = 'ER_READ_ONLY_TRANSACTION'; +exports[1208] = 'ER_DROP_DB_WITH_READ_LOCK'; +exports[1209] = 'ER_CREATE_DB_WITH_READ_LOCK'; +exports[1210] = 'ER_WRONG_ARGUMENTS'; +exports[1211] = 'ER_NO_PERMISSION_TO_CREATE_USER'; +exports[1212] = 'ER_UNION_TABLES_IN_DIFFERENT_DIR'; +exports[1213] = 'ER_LOCK_DEADLOCK'; +exports[1214] = 'ER_TABLE_CANT_HANDLE_FT'; +exports[1215] = 'ER_CANNOT_ADD_FOREIGN'; +exports[1216] = 'ER_NO_REFERENCED_ROW'; +exports[1217] = 'ER_ROW_IS_REFERENCED'; +exports[1218] = 'ER_CONNECT_TO_MASTER'; +exports[1219] = 'ER_QUERY_ON_MASTER'; +exports[1220] = 'ER_ERROR_WHEN_EXECUTING_COMMAND'; +exports[1221] = 'ER_WRONG_USAGE'; +exports[1222] = 'ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT'; +exports[1223] = 'ER_CANT_UPDATE_WITH_READLOCK'; +exports[1224] = 'ER_MIXING_NOT_ALLOWED'; +exports[1225] = 'ER_DUP_ARGUMENT'; +exports[1226] = 'ER_USER_LIMIT_REACHED'; +exports[1227] = 'ER_SPECIFIC_ACCESS_DENIED_ERROR'; +exports[1228] = 'ER_LOCAL_VARIABLE'; +exports[1229] = 'ER_GLOBAL_VARIABLE'; +exports[1230] = 'ER_NO_DEFAULT'; +exports[1231] = 'ER_WRONG_VALUE_FOR_VAR'; +exports[1232] = 'ER_WRONG_TYPE_FOR_VAR'; +exports[1233] = 'ER_VAR_CANT_BE_READ'; +exports[1234] = 'ER_CANT_USE_OPTION_HERE'; +exports[1235] = 'ER_NOT_SUPPORTED_YET'; +exports[1236] = 'ER_MASTER_FATAL_ERROR_READING_BINLOG'; +exports[1237] = 'ER_SLAVE_IGNORED_TABLE'; +exports[1238] = 'ER_INCORRECT_GLOBAL_LOCAL_VAR'; +exports[1239] = 'ER_WRONG_FK_DEF'; +exports[1240] = 'ER_KEY_REF_DO_NOT_MATCH_TABLE_REF'; +exports[1241] = 'ER_OPERAND_COLUMNS'; +exports[1242] = 'ER_SUBQUERY_NO_1_ROW'; +exports[1243] = 'ER_UNKNOWN_STMT_HANDLER'; +exports[1244] = 'ER_CORRUPT_HELP_DB'; +exports[1245] = 'ER_CYCLIC_REFERENCE'; +exports[1246] = 'ER_AUTO_CONVERT'; +exports[1247] = 'ER_ILLEGAL_REFERENCE'; +exports[1248] = 'ER_DERIVED_MUST_HAVE_ALIAS'; +exports[1249] = 'ER_SELECT_REDUCED'; +exports[1250] = 'ER_TABLENAME_NOT_ALLOWED_HERE'; +exports[1251] = 'ER_NOT_SUPPORTED_AUTH_MODE'; +exports[1252] = 'ER_SPATIAL_CANT_HAVE_NULL'; +exports[1253] = 'ER_COLLATION_CHARSET_MISMATCH'; +exports[1254] = 'ER_SLAVE_WAS_RUNNING'; +exports[1255] = 'ER_SLAVE_WAS_NOT_RUNNING'; +exports[1256] = 'ER_TOO_BIG_FOR_UNCOMPRESS'; +exports[1257] = 'ER_ZLIB_Z_MEM_ERROR'; +exports[1258] = 'ER_ZLIB_Z_BUF_ERROR'; +exports[1259] = 'ER_ZLIB_Z_DATA_ERROR'; +exports[1260] = 'ER_CUT_VALUE_GROUP_CONCAT'; +exports[1261] = 'ER_WARN_TOO_FEW_RECORDS'; +exports[1262] = 'ER_WARN_TOO_MANY_RECORDS'; +exports[1263] = 'ER_WARN_NULL_TO_NOTNULL'; +exports[1264] = 'ER_WARN_DATA_OUT_OF_RANGE'; +exports[1265] = 'WARN_DATA_TRUNCATED'; +exports[1266] = 'ER_WARN_USING_OTHER_HANDLER'; +exports[1267] = 'ER_CANT_AGGREGATE_2COLLATIONS'; +exports[1268] = 'ER_DROP_USER'; +exports[1269] = 'ER_REVOKE_GRANTS'; +exports[1270] = 'ER_CANT_AGGREGATE_3COLLATIONS'; +exports[1271] = 'ER_CANT_AGGREGATE_NCOLLATIONS'; +exports[1272] = 'ER_VARIABLE_IS_NOT_STRUCT'; +exports[1273] = 'ER_UNKNOWN_COLLATION'; +exports[1274] = 'ER_SLAVE_IGNORED_SSL_PARAMS'; +exports[1275] = 'ER_SERVER_IS_IN_SECURE_AUTH_MODE'; +exports[1276] = 'ER_WARN_FIELD_RESOLVED'; +exports[1277] = 'ER_BAD_SLAVE_UNTIL_COND'; +exports[1278] = 'ER_MISSING_SKIP_SLAVE'; +exports[1279] = 'ER_UNTIL_COND_IGNORED'; +exports[1280] = 'ER_WRONG_NAME_FOR_INDEX'; +exports[1281] = 'ER_WRONG_NAME_FOR_CATALOG'; +exports[1282] = 'ER_WARN_QC_RESIZE'; +exports[1283] = 'ER_BAD_FT_COLUMN'; +exports[1284] = 'ER_UNKNOWN_KEY_CACHE'; +exports[1285] = 'ER_WARN_HOSTNAME_WONT_WORK'; +exports[1286] = 'ER_UNKNOWN_STORAGE_ENGINE'; +exports[1287] = 'ER_WARN_DEPRECATED_SYNTAX'; +exports[1288] = 'ER_NON_UPDATABLE_TABLE'; +exports[1289] = 'ER_FEATURE_DISABLED'; +exports[1290] = 'ER_OPTION_PREVENTS_STATEMENT'; +exports[1291] = 'ER_DUPLICATED_VALUE_IN_TYPE'; +exports[1292] = 'ER_TRUNCATED_WRONG_VALUE'; +exports[1293] = 'ER_TOO_MUCH_AUTO_TIMESTAMP_COLS'; +exports[1294] = 'ER_INVALID_ON_UPDATE'; +exports[1295] = 'ER_UNSUPPORTED_PS'; +exports[1296] = 'ER_GET_ERRMSG'; +exports[1297] = 'ER_GET_TEMPORARY_ERRMSG'; +exports[1298] = 'ER_UNKNOWN_TIME_ZONE'; +exports[1299] = 'ER_WARN_INVALID_TIMESTAMP'; +exports[1300] = 'ER_INVALID_CHARACTER_STRING'; +exports[1301] = 'ER_WARN_ALLOWED_PACKET_OVERFLOWED'; +exports[1302] = 'ER_CONFLICTING_DECLARATIONS'; +exports[1303] = 'ER_SP_NO_RECURSIVE_CREATE'; +exports[1304] = 'ER_SP_ALREADY_EXISTS'; +exports[1305] = 'ER_SP_DOES_NOT_EXIST'; +exports[1306] = 'ER_SP_DROP_FAILED'; +exports[1307] = 'ER_SP_STORE_FAILED'; +exports[1308] = 'ER_SP_LILABEL_MISMATCH'; +exports[1309] = 'ER_SP_LABEL_REDEFINE'; +exports[1310] = 'ER_SP_LABEL_MISMATCH'; +exports[1311] = 'ER_SP_UNINIT_VAR'; +exports[1312] = 'ER_SP_BADSELECT'; +exports[1313] = 'ER_SP_BADRETURN'; +exports[1314] = 'ER_SP_BADSTATEMENT'; +exports[1315] = 'ER_UPDATE_LOG_DEPRECATED_IGNORED'; +exports[1316] = 'ER_UPDATE_LOG_DEPRECATED_TRANSLATED'; +exports[1317] = 'ER_QUERY_INTERRUPTED'; +exports[1318] = 'ER_SP_WRONG_NO_OF_ARGS'; +exports[1319] = 'ER_SP_COND_MISMATCH'; +exports[1320] = 'ER_SP_NORETURN'; +exports[1321] = 'ER_SP_NORETURNEND'; +exports[1322] = 'ER_SP_BAD_CURSOR_QUERY'; +exports[1323] = 'ER_SP_BAD_CURSOR_SELECT'; +exports[1324] = 'ER_SP_CURSOR_MISMATCH'; +exports[1325] = 'ER_SP_CURSOR_ALREADY_OPEN'; +exports[1326] = 'ER_SP_CURSOR_NOT_OPEN'; +exports[1327] = 'ER_SP_UNDECLARED_VAR'; +exports[1328] = 'ER_SP_WRONG_NO_OF_FETCH_ARGS'; +exports[1329] = 'ER_SP_FETCH_NO_DATA'; +exports[1330] = 'ER_SP_DUP_PARAM'; +exports[1331] = 'ER_SP_DUP_VAR'; +exports[1332] = 'ER_SP_DUP_COND'; +exports[1333] = 'ER_SP_DUP_CURS'; +exports[1334] = 'ER_SP_CANT_ALTER'; +exports[1335] = 'ER_SP_SUBSELECT_NYI'; +exports[1336] = 'ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG'; +exports[1337] = 'ER_SP_VARCOND_AFTER_CURSHNDLR'; +exports[1338] = 'ER_SP_CURSOR_AFTER_HANDLER'; +exports[1339] = 'ER_SP_CASE_NOT_FOUND'; +exports[1340] = 'ER_FPARSER_TOO_BIG_FILE'; +exports[1341] = 'ER_FPARSER_BAD_HEADER'; +exports[1342] = 'ER_FPARSER_EOF_IN_COMMENT'; +exports[1343] = 'ER_FPARSER_ERROR_IN_PARAMETER'; +exports[1344] = 'ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER'; +exports[1345] = 'ER_VIEW_NO_EXPLAIN'; +exports[1346] = 'ER_FRM_UNKNOWN_TYPE'; +exports[1347] = 'ER_WRONG_OBJECT'; +exports[1348] = 'ER_NONUPDATEABLE_COLUMN'; +exports[1349] = 'ER_VIEW_SELECT_DERIVED'; +exports[1350] = 'ER_VIEW_SELECT_CLAUSE'; +exports[1351] = 'ER_VIEW_SELECT_VARIABLE'; +exports[1352] = 'ER_VIEW_SELECT_TMPTABLE'; +exports[1353] = 'ER_VIEW_WRONG_LIST'; +exports[1354] = 'ER_WARN_VIEW_MERGE'; +exports[1355] = 'ER_WARN_VIEW_WITHOUT_KEY'; +exports[1356] = 'ER_VIEW_INVALID'; +exports[1357] = 'ER_SP_NO_DROP_SP'; +exports[1358] = 'ER_SP_GOTO_IN_HNDLR'; +exports[1359] = 'ER_TRG_ALREADY_EXISTS'; +exports[1360] = 'ER_TRG_DOES_NOT_EXIST'; +exports[1361] = 'ER_TRG_ON_VIEW_OR_TEMP_TABLE'; +exports[1362] = 'ER_TRG_CANT_CHANGE_ROW'; +exports[1363] = 'ER_TRG_NO_SUCH_ROW_IN_TRG'; +exports[1364] = 'ER_NO_DEFAULT_FOR_FIELD'; +exports[1365] = 'ER_DIVISION_BY_ZERO'; +exports[1366] = 'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD'; +exports[1367] = 'ER_ILLEGAL_VALUE_FOR_TYPE'; +exports[1368] = 'ER_VIEW_NONUPD_CHECK'; +exports[1369] = 'ER_VIEW_CHECK_FAILED'; +exports[1370] = 'ER_PROCACCESS_DENIED_ERROR'; +exports[1371] = 'ER_RELAY_LOG_FAIL'; +exports[1372] = 'ER_PASSWD_LENGTH'; +exports[1373] = 'ER_UNKNOWN_TARGET_BINLOG'; +exports[1374] = 'ER_IO_ERR_LOG_INDEX_READ'; +exports[1375] = 'ER_BINLOG_PURGE_PROHIBITED'; +exports[1376] = 'ER_FSEEK_FAIL'; +exports[1377] = 'ER_BINLOG_PURGE_FATAL_ERR'; +exports[1378] = 'ER_LOG_IN_USE'; +exports[1379] = 'ER_LOG_PURGE_UNKNOWN_ERR'; +exports[1380] = 'ER_RELAY_LOG_INIT'; +exports[1381] = 'ER_NO_BINARY_LOGGING'; +exports[1382] = 'ER_RESERVED_SYNTAX'; +exports[1383] = 'ER_WSAS_FAILED'; +exports[1384] = 'ER_DIFF_GROUPS_PROC'; +exports[1385] = 'ER_NO_GROUP_FOR_PROC'; +exports[1386] = 'ER_ORDER_WITH_PROC'; +exports[1387] = 'ER_LOGGING_PROHIBIT_CHANGING_OF'; +exports[1388] = 'ER_NO_FILE_MAPPING'; +exports[1389] = 'ER_WRONG_MAGIC'; +exports[1390] = 'ER_PS_MANY_PARAM'; +exports[1391] = 'ER_KEY_PART_0'; +exports[1392] = 'ER_VIEW_CHECKSUM'; +exports[1393] = 'ER_VIEW_MULTIUPDATE'; +exports[1394] = 'ER_VIEW_NO_INSERT_FIELD_LIST'; +exports[1395] = 'ER_VIEW_DELETE_MERGE_VIEW'; +exports[1396] = 'ER_CANNOT_USER'; +exports[1397] = 'ER_XAER_NOTA'; +exports[1398] = 'ER_XAER_INVAL'; +exports[1399] = 'ER_XAER_RMFAIL'; +exports[1400] = 'ER_XAER_OUTSIDE'; +exports[1401] = 'ER_XAER_RMERR'; +exports[1402] = 'ER_XA_RBROLLBACK'; +exports[1403] = 'ER_NONEXISTING_PROC_GRANT'; +exports[1404] = 'ER_PROC_AUTO_GRANT_FAIL'; +exports[1405] = 'ER_PROC_AUTO_REVOKE_FAIL'; +exports[1406] = 'ER_DATA_TOO_LONG'; +exports[1407] = 'ER_SP_BAD_SQLSTATE'; +exports[1408] = 'ER_STARTUP'; +exports[1409] = 'ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR'; +exports[1410] = 'ER_CANT_CREATE_USER_WITH_GRANT'; +exports[1411] = 'ER_WRONG_VALUE_FOR_TYPE'; +exports[1412] = 'ER_TABLE_DEF_CHANGED'; +exports[1413] = 'ER_SP_DUP_HANDLER'; +exports[1414] = 'ER_SP_NOT_VAR_ARG'; +exports[1415] = 'ER_SP_NO_RETSET'; +exports[1416] = 'ER_CANT_CREATE_GEOMETRY_OBJECT'; +exports[1417] = 'ER_FAILED_ROUTINE_BREAK_BINLOG'; +exports[1418] = 'ER_BINLOG_UNSAFE_ROUTINE'; +exports[1419] = 'ER_BINLOG_CREATE_ROUTINE_NEED_SUPER'; +exports[1420] = 'ER_EXEC_STMT_WITH_OPEN_CURSOR'; +exports[1421] = 'ER_STMT_HAS_NO_OPEN_CURSOR'; +exports[1422] = 'ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG'; +exports[1423] = 'ER_NO_DEFAULT_FOR_VIEW_FIELD'; +exports[1424] = 'ER_SP_NO_RECURSION'; +exports[1425] = 'ER_TOO_BIG_SCALE'; +exports[1426] = 'ER_TOO_BIG_PRECISION'; +exports[1427] = 'ER_M_BIGGER_THAN_D'; +exports[1428] = 'ER_WRONG_LOCK_OF_SYSTEM_TABLE'; +exports[1429] = 'ER_CONNECT_TO_FOREIGN_DATA_SOURCE'; +exports[1430] = 'ER_QUERY_ON_FOREIGN_DATA_SOURCE'; +exports[1431] = 'ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST'; +exports[1432] = 'ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE'; +exports[1433] = 'ER_FOREIGN_DATA_STRING_INVALID'; +exports[1434] = 'ER_CANT_CREATE_FEDERATED_TABLE'; +exports[1435] = 'ER_TRG_IN_WRONG_SCHEMA'; +exports[1436] = 'ER_STACK_OVERRUN_NEED_MORE'; +exports[1437] = 'ER_TOO_LONG_BODY'; +exports[1438] = 'ER_WARN_CANT_DROP_DEFAULT_KEYCACHE'; +exports[1439] = 'ER_TOO_BIG_DISPLAYWIDTH'; +exports[1440] = 'ER_XAER_DUPID'; +exports[1441] = 'ER_DATETIME_FUNCTION_OVERFLOW'; +exports[1442] = 'ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG'; +exports[1443] = 'ER_VIEW_PREVENT_UPDATE'; +exports[1444] = 'ER_PS_NO_RECURSION'; +exports[1445] = 'ER_SP_CANT_SET_AUTOCOMMIT'; +exports[1446] = 'ER_MALFORMED_DEFINER'; +exports[1447] = 'ER_VIEW_FRM_NO_USER'; +exports[1448] = 'ER_VIEW_OTHER_USER'; +exports[1449] = 'ER_NO_SUCH_USER'; +exports[1450] = 'ER_FORBID_SCHEMA_CHANGE'; +exports[1451] = 'ER_ROW_IS_REFERENCED_2'; +exports[1452] = 'ER_NO_REFERENCED_ROW_2'; +exports[1453] = 'ER_SP_BAD_VAR_SHADOW'; +exports[1454] = 'ER_TRG_NO_DEFINER'; +exports[1455] = 'ER_OLD_FILE_FORMAT'; +exports[1456] = 'ER_SP_RECURSION_LIMIT'; +exports[1457] = 'ER_SP_PROC_TABLE_CORRUPT'; +exports[1458] = 'ER_SP_WRONG_NAME'; +exports[1459] = 'ER_TABLE_NEEDS_UPGRADE'; +exports[1460] = 'ER_SP_NO_AGGREGATE'; +exports[1461] = 'ER_MAX_PREPARED_STMT_COUNT_REACHED'; +exports[1462] = 'ER_VIEW_RECURSIVE'; +exports[1463] = 'ER_NON_GROUPING_FIELD_USED'; +exports[1464] = 'ER_TABLE_CANT_HANDLE_SPKEYS'; +exports[1465] = 'ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA'; +exports[1466] = 'ER_REMOVED_SPACES'; +exports[1467] = 'ER_AUTOINC_READ_FAILED'; +exports[1468] = 'ER_USERNAME'; +exports[1469] = 'ER_HOSTNAME'; +exports[1470] = 'ER_WRONG_STRING_LENGTH'; +exports[1471] = 'ER_NON_INSERTABLE_TABLE'; +exports[1472] = 'ER_ADMIN_WRONG_MRG_TABLE'; +exports[1473] = 'ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT'; +exports[1474] = 'ER_NAME_BECOMES_EMPTY'; +exports[1475] = 'ER_AMBIGUOUS_FIELD_TERM'; +exports[1476] = 'ER_FOREIGN_SERVER_EXISTS'; +exports[1477] = 'ER_FOREIGN_SERVER_DOESNT_EXIST'; +exports[1478] = 'ER_ILLEGAL_HA_CREATE_OPTION'; +exports[1479] = 'ER_PARTITION_REQUIRES_VALUES_ERROR'; +exports[1480] = 'ER_PARTITION_WRONG_VALUES_ERROR'; +exports[1481] = 'ER_PARTITION_MAXVALUE_ERROR'; +exports[1482] = 'ER_PARTITION_SUBPARTITION_ERROR'; +exports[1483] = 'ER_PARTITION_SUBPART_MIX_ERROR'; +exports[1484] = 'ER_PARTITION_WRONG_NO_PART_ERROR'; +exports[1485] = 'ER_PARTITION_WRONG_NO_SUBPART_ERROR'; +exports[1486] = 'ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR'; +exports[1487] = 'ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR'; +exports[1488] = 'ER_FIELD_NOT_FOUND_PART_ERROR'; +exports[1489] = 'ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR'; +exports[1490] = 'ER_INCONSISTENT_PARTITION_INFO_ERROR'; +exports[1491] = 'ER_PARTITION_FUNC_NOT_ALLOWED_ERROR'; +exports[1492] = 'ER_PARTITIONS_MUST_BE_DEFINED_ERROR'; +exports[1493] = 'ER_RANGE_NOT_INCREASING_ERROR'; +exports[1494] = 'ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR'; +exports[1495] = 'ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR'; +exports[1496] = 'ER_PARTITION_ENTRY_ERROR'; +exports[1497] = 'ER_MIX_HANDLER_ERROR'; +exports[1498] = 'ER_PARTITION_NOT_DEFINED_ERROR'; +exports[1499] = 'ER_TOO_MANY_PARTITIONS_ERROR'; +exports[1500] = 'ER_SUBPARTITION_ERROR'; +exports[1501] = 'ER_CANT_CREATE_HANDLER_FILE'; +exports[1502] = 'ER_BLOB_FIELD_IN_PART_FUNC_ERROR'; +exports[1503] = 'ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF'; +exports[1504] = 'ER_NO_PARTS_ERROR'; +exports[1505] = 'ER_PARTITION_MGMT_ON_NONPARTITIONED'; +exports[1506] = 'ER_FOREIGN_KEY_ON_PARTITIONED'; +exports[1507] = 'ER_DROP_PARTITION_NON_EXISTENT'; +exports[1508] = 'ER_DROP_LAST_PARTITION'; +exports[1509] = 'ER_COALESCE_ONLY_ON_HASH_PARTITION'; +exports[1510] = 'ER_REORG_HASH_ONLY_ON_SAME_NO'; +exports[1511] = 'ER_REORG_NO_PARAM_ERROR'; +exports[1512] = 'ER_ONLY_ON_RANGE_LIST_PARTITION'; +exports[1513] = 'ER_ADD_PARTITION_SUBPART_ERROR'; +exports[1514] = 'ER_ADD_PARTITION_NO_NEW_PARTITION'; +exports[1515] = 'ER_COALESCE_PARTITION_NO_PARTITION'; +exports[1516] = 'ER_REORG_PARTITION_NOT_EXIST'; +exports[1517] = 'ER_SAME_NAME_PARTITION'; +exports[1518] = 'ER_NO_BINLOG_ERROR'; +exports[1519] = 'ER_CONSECUTIVE_REORG_PARTITIONS'; +exports[1520] = 'ER_REORG_OUTSIDE_RANGE'; +exports[1521] = 'ER_PARTITION_FUNCTION_FAILURE'; +exports[1522] = 'ER_PART_STATE_ERROR'; +exports[1523] = 'ER_LIMITED_PART_RANGE'; +exports[1524] = 'ER_PLUGIN_IS_NOT_LOADED'; +exports[1525] = 'ER_WRONG_VALUE'; +exports[1526] = 'ER_NO_PARTITION_FOR_GIVEN_VALUE'; +exports[1527] = 'ER_FILEGROUP_OPTION_ONLY_ONCE'; +exports[1528] = 'ER_CREATE_FILEGROUP_FAILED'; +exports[1529] = 'ER_DROP_FILEGROUP_FAILED'; +exports[1530] = 'ER_TABLESPACE_AUTO_EXTEND_ERROR'; +exports[1531] = 'ER_WRONG_SIZE_NUMBER'; +exports[1532] = 'ER_SIZE_OVERFLOW_ERROR'; +exports[1533] = 'ER_ALTER_FILEGROUP_FAILED'; +exports[1534] = 'ER_BINLOG_ROW_LOGGING_FAILED'; +exports[1535] = 'ER_BINLOG_ROW_WRONG_TABLE_DEF'; +exports[1536] = 'ER_BINLOG_ROW_RBR_TO_SBR'; +exports[1537] = 'ER_EVENT_ALREADY_EXISTS'; +exports[1538] = 'ER_EVENT_STORE_FAILED'; +exports[1539] = 'ER_EVENT_DOES_NOT_EXIST'; +exports[1540] = 'ER_EVENT_CANT_ALTER'; +exports[1541] = 'ER_EVENT_DROP_FAILED'; +exports[1542] = 'ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG'; +exports[1543] = 'ER_EVENT_ENDS_BEFORE_STARTS'; +exports[1544] = 'ER_EVENT_EXEC_TIME_IN_THE_PAST'; +exports[1545] = 'ER_EVENT_OPEN_TABLE_FAILED'; +exports[1546] = 'ER_EVENT_NEITHER_M_EXPR_NOR_M_AT'; +exports[1547] = 'ER_COL_COUNT_DOESNT_MATCH_CORRUPTED'; +exports[1548] = 'ER_CANNOT_LOAD_FROM_TABLE'; +exports[1549] = 'ER_EVENT_CANNOT_DELETE'; +exports[1550] = 'ER_EVENT_COMPILE_ERROR'; +exports[1551] = 'ER_EVENT_SAME_NAME'; +exports[1552] = 'ER_EVENT_DATA_TOO_LONG'; +exports[1553] = 'ER_DROP_INDEX_FK'; +exports[1554] = 'ER_WARN_DEPRECATED_SYNTAX_WITH_VER'; +exports[1555] = 'ER_CANT_WRITE_LOCK_LOG_TABLE'; +exports[1556] = 'ER_CANT_LOCK_LOG_TABLE'; +exports[1557] = 'ER_FOREIGN_DUPLICATE_KEY'; +exports[1558] = 'ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE'; +exports[1559] = 'ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR'; +exports[1560] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT'; +exports[1561] = 'ER_NDB_CANT_SWITCH_BINLOG_FORMAT'; +exports[1562] = 'ER_PARTITION_NO_TEMPORARY'; +exports[1563] = 'ER_PARTITION_CONST_DOMAIN_ERROR'; +exports[1564] = 'ER_PARTITION_FUNCTION_IS_NOT_ALLOWED'; +exports[1565] = 'ER_DDL_LOG_ERROR'; +exports[1566] = 'ER_NULL_IN_VALUES_LESS_THAN'; +exports[1567] = 'ER_WRONG_PARTITION_NAME'; +exports[1568] = 'ER_CANT_CHANGE_TX_CHARACTERISTICS'; +exports[1569] = 'ER_DUP_ENTRY_AUTOINCREMENT_CASE'; +exports[1570] = 'ER_EVENT_MODIFY_QUEUE_ERROR'; +exports[1571] = 'ER_EVENT_SET_VAR_ERROR'; +exports[1572] = 'ER_PARTITION_MERGE_ERROR'; +exports[1573] = 'ER_CANT_ACTIVATE_LOG'; +exports[1574] = 'ER_RBR_NOT_AVAILABLE'; +exports[1575] = 'ER_BASE64_DECODE_ERROR'; +exports[1576] = 'ER_EVENT_RECURSION_FORBIDDEN'; +exports[1577] = 'ER_EVENTS_DB_ERROR'; +exports[1578] = 'ER_ONLY_INTEGERS_ALLOWED'; +exports[1579] = 'ER_UNSUPORTED_LOG_ENGINE'; +exports[1580] = 'ER_BAD_LOG_STATEMENT'; +exports[1581] = 'ER_CANT_RENAME_LOG_TABLE'; +exports[1582] = 'ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT'; +exports[1583] = 'ER_WRONG_PARAMETERS_TO_NATIVE_FCT'; +exports[1584] = 'ER_WRONG_PARAMETERS_TO_STORED_FCT'; +exports[1585] = 'ER_NATIVE_FCT_NAME_COLLISION'; +exports[1586] = 'ER_DUP_ENTRY_WITH_KEY_NAME'; +exports[1587] = 'ER_BINLOG_PURGE_EMFILE'; +exports[1588] = 'ER_EVENT_CANNOT_CREATE_IN_THE_PAST'; +exports[1589] = 'ER_EVENT_CANNOT_ALTER_IN_THE_PAST'; +exports[1590] = 'ER_SLAVE_INCIDENT'; +exports[1591] = 'ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT'; +exports[1592] = 'ER_BINLOG_UNSAFE_STATEMENT'; +exports[1593] = 'ER_SLAVE_FATAL_ERROR'; +exports[1594] = 'ER_SLAVE_RELAY_LOG_READ_FAILURE'; +exports[1595] = 'ER_SLAVE_RELAY_LOG_WRITE_FAILURE'; +exports[1596] = 'ER_SLAVE_CREATE_EVENT_FAILURE'; +exports[1597] = 'ER_SLAVE_MASTER_COM_FAILURE'; +exports[1598] = 'ER_BINLOG_LOGGING_IMPOSSIBLE'; +exports[1599] = 'ER_VIEW_NO_CREATION_CTX'; +exports[1600] = 'ER_VIEW_INVALID_CREATION_CTX'; +exports[1601] = 'ER_SR_INVALID_CREATION_CTX'; +exports[1602] = 'ER_TRG_CORRUPTED_FILE'; +exports[1603] = 'ER_TRG_NO_CREATION_CTX'; +exports[1604] = 'ER_TRG_INVALID_CREATION_CTX'; +exports[1605] = 'ER_EVENT_INVALID_CREATION_CTX'; +exports[1606] = 'ER_TRG_CANT_OPEN_TABLE'; +exports[1607] = 'ER_CANT_CREATE_SROUTINE'; +exports[1608] = 'ER_NEVER_USED'; +exports[1609] = 'ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT'; +exports[1610] = 'ER_SLAVE_CORRUPT_EVENT'; +exports[1611] = 'ER_LOAD_DATA_INVALID_COLUMN'; +exports[1612] = 'ER_LOG_PURGE_NO_FILE'; +exports[1613] = 'ER_XA_RBTIMEOUT'; +exports[1614] = 'ER_XA_RBDEADLOCK'; +exports[1615] = 'ER_NEED_REPREPARE'; +exports[1616] = 'ER_DELAYED_NOT_SUPPORTED'; +exports[1617] = 'WARN_NO_MASTER_INFO'; +exports[1618] = 'WARN_OPTION_IGNORED'; +exports[1619] = 'ER_PLUGIN_DELETE_BUILTIN'; +exports[1620] = 'WARN_PLUGIN_BUSY'; +exports[1621] = 'ER_VARIABLE_IS_READONLY'; +exports[1622] = 'ER_WARN_ENGINE_TRANSACTION_ROLLBACK'; +exports[1623] = 'ER_SLAVE_HEARTBEAT_FAILURE'; +exports[1624] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE'; +exports[1625] = 'ER_NDB_REPLICATION_SCHEMA_ERROR'; +exports[1626] = 'ER_CONFLICT_FN_PARSE_ERROR'; +exports[1627] = 'ER_EXCEPTIONS_WRITE_ERROR'; +exports[1628] = 'ER_TOO_LONG_TABLE_COMMENT'; +exports[1629] = 'ER_TOO_LONG_FIELD_COMMENT'; +exports[1630] = 'ER_FUNC_INEXISTENT_NAME_COLLISION'; +exports[1631] = 'ER_DATABASE_NAME'; +exports[1632] = 'ER_TABLE_NAME'; +exports[1633] = 'ER_PARTITION_NAME'; +exports[1634] = 'ER_SUBPARTITION_NAME'; +exports[1635] = 'ER_TEMPORARY_NAME'; +exports[1636] = 'ER_RENAMED_NAME'; +exports[1637] = 'ER_TOO_MANY_CONCURRENT_TRXS'; +exports[1638] = 'WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED'; +exports[1639] = 'ER_DEBUG_SYNC_TIMEOUT'; +exports[1640] = 'ER_DEBUG_SYNC_HIT_LIMIT'; +exports[1641] = 'ER_DUP_SIGNAL_SET'; +exports[1642] = 'ER_SIGNAL_WARN'; +exports[1643] = 'ER_SIGNAL_NOT_FOUND'; +exports[1644] = 'ER_SIGNAL_EXCEPTION'; +exports[1645] = 'ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER'; +exports[1646] = 'ER_SIGNAL_BAD_CONDITION_TYPE'; +exports[1647] = 'WARN_COND_ITEM_TRUNCATED'; +exports[1648] = 'ER_COND_ITEM_TOO_LONG'; +exports[1649] = 'ER_UNKNOWN_LOCALE'; +exports[1650] = 'ER_SLAVE_IGNORE_SERVER_IDS'; +exports[1651] = 'ER_QUERY_CACHE_DISABLED'; +exports[1652] = 'ER_SAME_NAME_PARTITION_FIELD'; +exports[1653] = 'ER_PARTITION_COLUMN_LIST_ERROR'; +exports[1654] = 'ER_WRONG_TYPE_COLUMN_VALUE_ERROR'; +exports[1655] = 'ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR'; +exports[1656] = 'ER_MAXVALUE_IN_VALUES_IN'; +exports[1657] = 'ER_TOO_MANY_VALUES_ERROR'; +exports[1658] = 'ER_ROW_SINGLE_PARTITION_FIELD_ERROR'; +exports[1659] = 'ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD'; +exports[1660] = 'ER_PARTITION_FIELDS_TOO_LONG'; +exports[1661] = 'ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE'; +exports[1662] = 'ER_BINLOG_ROW_MODE_AND_STMT_ENGINE'; +exports[1663] = 'ER_BINLOG_UNSAFE_AND_STMT_ENGINE'; +exports[1664] = 'ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE'; +exports[1665] = 'ER_BINLOG_STMT_MODE_AND_ROW_ENGINE'; +exports[1666] = 'ER_BINLOG_ROW_INJECTION_AND_STMT_MODE'; +exports[1667] = 'ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE'; +exports[1668] = 'ER_BINLOG_UNSAFE_LIMIT'; +exports[1669] = 'ER_BINLOG_UNSAFE_INSERT_DELAYED'; +exports[1670] = 'ER_BINLOG_UNSAFE_SYSTEM_TABLE'; +exports[1671] = 'ER_BINLOG_UNSAFE_AUTOINC_COLUMNS'; +exports[1672] = 'ER_BINLOG_UNSAFE_UDF'; +exports[1673] = 'ER_BINLOG_UNSAFE_SYSTEM_VARIABLE'; +exports[1674] = 'ER_BINLOG_UNSAFE_SYSTEM_FUNCTION'; +exports[1675] = 'ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS'; +exports[1676] = 'ER_MESSAGE_AND_STATEMENT'; +exports[1677] = 'ER_SLAVE_CONVERSION_FAILED'; +exports[1678] = 'ER_SLAVE_CANT_CREATE_CONVERSION'; +exports[1679] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT'; +exports[1680] = 'ER_PATH_LENGTH'; +exports[1681] = 'ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT'; +exports[1682] = 'ER_WRONG_NATIVE_TABLE_STRUCTURE'; +exports[1683] = 'ER_WRONG_PERFSCHEMA_USAGE'; +exports[1684] = 'ER_WARN_I_S_SKIPPED_TABLE'; +exports[1685] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT'; +exports[1686] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT'; +exports[1687] = 'ER_SPATIAL_MUST_HAVE_GEOM_COL'; +exports[1688] = 'ER_TOO_LONG_INDEX_COMMENT'; +exports[1689] = 'ER_LOCK_ABORTED'; +exports[1690] = 'ER_DATA_OUT_OF_RANGE'; +exports[1691] = 'ER_WRONG_SPVAR_TYPE_IN_LIMIT'; +exports[1692] = 'ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE'; +exports[1693] = 'ER_BINLOG_UNSAFE_MIXED_STATEMENT'; +exports[1694] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN'; +exports[1695] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN'; +exports[1696] = 'ER_FAILED_READ_FROM_PAR_FILE'; +exports[1697] = 'ER_VALUES_IS_NOT_INT_TYPE_ERROR'; +exports[1698] = 'ER_ACCESS_DENIED_NO_PASSWORD_ERROR'; +exports[1699] = 'ER_SET_PASSWORD_AUTH_PLUGIN'; +exports[1700] = 'ER_GRANT_PLUGIN_USER_EXISTS'; +exports[1701] = 'ER_TRUNCATE_ILLEGAL_FK'; +exports[1702] = 'ER_PLUGIN_IS_PERMANENT'; +exports[1703] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN'; +exports[1704] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX'; +exports[1705] = 'ER_STMT_CACHE_FULL'; +exports[1706] = 'ER_MULTI_UPDATE_KEY_CONFLICT'; +exports[1707] = 'ER_TABLE_NEEDS_REBUILD'; +exports[1708] = 'WARN_OPTION_BELOW_LIMIT'; +exports[1709] = 'ER_INDEX_COLUMN_TOO_LONG'; +exports[1710] = 'ER_ERROR_IN_TRIGGER_BODY'; +exports[1711] = 'ER_ERROR_IN_UNKNOWN_TRIGGER_BODY'; +exports[1712] = 'ER_INDEX_CORRUPT'; +exports[1713] = 'ER_UNDO_RECORD_TOO_BIG'; +exports[1714] = 'ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT'; +exports[1715] = 'ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE'; +exports[1716] = 'ER_BINLOG_UNSAFE_REPLACE_SELECT'; +exports[1717] = 'ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT'; +exports[1718] = 'ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT'; +exports[1719] = 'ER_BINLOG_UNSAFE_UPDATE_IGNORE'; +exports[1720] = 'ER_PLUGIN_NO_UNINSTALL'; +exports[1721] = 'ER_PLUGIN_NO_INSTALL'; +exports[1722] = 'ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT'; +exports[1723] = 'ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC'; +exports[1724] = 'ER_BINLOG_UNSAFE_INSERT_TWO_KEYS'; +exports[1725] = 'ER_TABLE_IN_FK_CHECK'; +exports[1726] = 'ER_UNSUPPORTED_ENGINE'; +exports[1727] = 'ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST'; +exports[1728] = 'ER_CANNOT_LOAD_FROM_TABLE_V2'; +exports[1729] = 'ER_MASTER_DELAY_VALUE_OUT_OF_RANGE'; +exports[1730] = 'ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT'; +exports[1731] = 'ER_PARTITION_EXCHANGE_DIFFERENT_OPTION'; +exports[1732] = 'ER_PARTITION_EXCHANGE_PART_TABLE'; +exports[1733] = 'ER_PARTITION_EXCHANGE_TEMP_TABLE'; +exports[1734] = 'ER_PARTITION_INSTEAD_OF_SUBPARTITION'; +exports[1735] = 'ER_UNKNOWN_PARTITION'; +exports[1736] = 'ER_TABLES_DIFFERENT_METADATA'; +exports[1737] = 'ER_ROW_DOES_NOT_MATCH_PARTITION'; +exports[1738] = 'ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX'; +exports[1739] = 'ER_WARN_INDEX_NOT_APPLICABLE'; +exports[1740] = 'ER_PARTITION_EXCHANGE_FOREIGN_KEY'; +exports[1741] = 'ER_NO_SUCH_KEY_VALUE'; +exports[1742] = 'ER_RPL_INFO_DATA_TOO_LONG'; +exports[1743] = 'ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE'; +exports[1744] = 'ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE'; +exports[1745] = 'ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX'; +exports[1746] = 'ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT'; +exports[1747] = 'ER_PARTITION_CLAUSE_ON_NONPARTITIONED'; +exports[1748] = 'ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET'; +exports[1749] = 'ER_NO_SUCH_PARTITION'; +exports[1750] = 'ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE'; +exports[1751] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE'; +exports[1752] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE'; +exports[1753] = 'ER_MTS_FEATURE_IS_NOT_SUPPORTED'; +exports[1754] = 'ER_MTS_UPDATED_DBS_GREATER_MAX'; +exports[1755] = 'ER_MTS_CANT_PARALLEL'; +exports[1756] = 'ER_MTS_INCONSISTENT_DATA'; +exports[1757] = 'ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING'; +exports[1758] = 'ER_DA_INVALID_CONDITION_NUMBER'; +exports[1759] = 'ER_INSECURE_PLAIN_TEXT'; +exports[1760] = 'ER_INSECURE_CHANGE_MASTER'; +exports[1761] = 'ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO'; +exports[1762] = 'ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO'; +exports[1763] = 'ER_SQLTHREAD_WITH_SECURE_SLAVE'; +exports[1764] = 'ER_TABLE_HAS_NO_FT'; +exports[1765] = 'ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER'; +exports[1766] = 'ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION'; +exports[1767] = 'ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST'; +exports[1768] = 'ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION'; +exports[1769] = 'ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION'; +exports[1770] = 'ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL'; +exports[1771] = 'ER_SKIPPING_LOGGED_TRANSACTION'; +exports[1772] = 'ER_MALFORMED_GTID_SET_SPECIFICATION'; +exports[1773] = 'ER_MALFORMED_GTID_SET_ENCODING'; +exports[1774] = 'ER_MALFORMED_GTID_SPECIFICATION'; +exports[1775] = 'ER_GNO_EXHAUSTED'; +exports[1776] = 'ER_BAD_SLAVE_AUTO_POSITION'; +exports[1777] = 'ER_AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF'; +exports[1778] = 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET'; +exports[1779] = 'ER_GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON'; +exports[1780] = 'ER_GTID_MODE_REQUIRES_BINLOG'; +exports[1781] = 'ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF'; +exports[1782] = 'ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON'; +exports[1783] = 'ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF'; +exports[1784] = 'ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF'; +exports[1785] = 'ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE'; +exports[1786] = 'ER_GTID_UNSAFE_CREATE_SELECT'; +exports[1787] = 'ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION'; +exports[1788] = 'ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME'; +exports[1789] = 'ER_MASTER_HAS_PURGED_REQUIRED_GTIDS'; +exports[1790] = 'ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID'; +exports[1791] = 'ER_UNKNOWN_EXPLAIN_FORMAT'; +exports[1792] = 'ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION'; +exports[1793] = 'ER_TOO_LONG_TABLE_PARTITION_COMMENT'; +exports[1794] = 'ER_SLAVE_CONFIGURATION'; +exports[1795] = 'ER_INNODB_FT_LIMIT'; +exports[1796] = 'ER_INNODB_NO_FT_TEMP_TABLE'; +exports[1797] = 'ER_INNODB_FT_WRONG_DOCID_COLUMN'; +exports[1798] = 'ER_INNODB_FT_WRONG_DOCID_INDEX'; +exports[1799] = 'ER_INNODB_ONLINE_LOG_TOO_BIG'; +exports[1800] = 'ER_UNKNOWN_ALTER_ALGORITHM'; +exports[1801] = 'ER_UNKNOWN_ALTER_LOCK'; +exports[1802] = 'ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS'; +exports[1803] = 'ER_MTS_RECOVERY_FAILURE'; +exports[1804] = 'ER_MTS_RESET_WORKERS'; +exports[1805] = 'ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2'; +exports[1806] = 'ER_SLAVE_SILENT_RETRY_TRANSACTION'; +exports[1807] = 'ER_DISCARD_FK_CHECKS_RUNNING'; +exports[1808] = 'ER_TABLE_SCHEMA_MISMATCH'; +exports[1809] = 'ER_TABLE_IN_SYSTEM_TABLESPACE'; +exports[1810] = 'ER_IO_READ_ERROR'; +exports[1811] = 'ER_IO_WRITE_ERROR'; +exports[1812] = 'ER_TABLESPACE_MISSING'; +exports[1813] = 'ER_TABLESPACE_EXISTS'; +exports[1814] = 'ER_TABLESPACE_DISCARDED'; +exports[1815] = 'ER_INTERNAL_ERROR'; +exports[1816] = 'ER_INNODB_IMPORT_ERROR'; +exports[1817] = 'ER_INNODB_INDEX_CORRUPT'; +exports[1818] = 'ER_INVALID_YEAR_COLUMN_LENGTH'; +exports[1819] = 'ER_NOT_VALID_PASSWORD'; +exports[1820] = 'ER_MUST_CHANGE_PASSWORD'; +exports[1821] = 'ER_FK_NO_INDEX_CHILD'; +exports[1822] = 'ER_FK_NO_INDEX_PARENT'; +exports[1823] = 'ER_FK_FAIL_ADD_SYSTEM'; +exports[1824] = 'ER_FK_CANNOT_OPEN_PARENT'; +exports[1825] = 'ER_FK_INCORRECT_OPTION'; +exports[1826] = 'ER_FK_DUP_NAME'; +exports[1827] = 'ER_PASSWORD_FORMAT'; +exports[1828] = 'ER_FK_COLUMN_CANNOT_DROP'; +exports[1829] = 'ER_FK_COLUMN_CANNOT_DROP_CHILD'; +exports[1830] = 'ER_FK_COLUMN_NOT_NULL'; +exports[1831] = 'ER_DUP_INDEX'; +exports[1832] = 'ER_FK_COLUMN_CANNOT_CHANGE'; +exports[1833] = 'ER_FK_COLUMN_CANNOT_CHANGE_CHILD'; +exports[1834] = 'ER_FK_CANNOT_DELETE_PARENT'; +exports[1835] = 'ER_MALFORMED_PACKET'; +exports[1836] = 'ER_READ_ONLY_MODE'; +exports[1837] = 'ER_GTID_NEXT_TYPE_UNDEFINED_GROUP'; +exports[1838] = 'ER_VARIABLE_NOT_SETTABLE_IN_SP'; +exports[1839] = 'ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF'; +exports[1840] = 'ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY'; +exports[1841] = 'ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY'; +exports[1842] = 'ER_GTID_PURGED_WAS_CHANGED'; +exports[1843] = 'ER_GTID_EXECUTED_WAS_CHANGED'; +exports[1844] = 'ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES'; +exports[1845] = 'ER_ALTER_OPERATION_NOT_SUPPORTED'; +exports[1846] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON'; +exports[1847] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY'; +exports[1848] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION'; +exports[1849] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME'; +exports[1850] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE'; +exports[1851] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK'; +exports[1852] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE'; +exports[1853] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK'; +exports[1854] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC'; +exports[1855] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS'; +exports[1856] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS'; +exports[1857] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS'; +exports[1858] = 'ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE'; +exports[1859] = 'ER_DUP_UNKNOWN_IN_INDEX'; +exports[1860] = 'ER_IDENT_CAUSES_TOO_LONG_PATH'; +exports[1861] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL'; +exports[1862] = 'ER_MUST_CHANGE_PASSWORD_LOGIN'; +exports[1863] = 'ER_ROW_IN_WRONG_PARTITION'; +exports[1864] = 'ER_MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX'; +exports[1865] = 'ER_INNODB_NO_FT_USES_PARSER'; +exports[1866] = 'ER_BINLOG_LOGICAL_CORRUPTION'; +exports[1867] = 'ER_WARN_PURGE_LOG_IN_USE'; +exports[1868] = 'ER_WARN_PURGE_LOG_IS_ACTIVE'; +exports[1869] = 'ER_AUTO_INCREMENT_CONFLICT'; +exports[1870] = 'WARN_ON_BLOCKHOLE_IN_RBR'; +exports[1871] = 'ER_SLAVE_MI_INIT_REPOSITORY'; +exports[1872] = 'ER_SLAVE_RLI_INIT_REPOSITORY'; +exports[1873] = 'ER_ACCESS_DENIED_CHANGE_USER_ERROR'; +exports[1874] = 'ER_INNODB_READ_ONLY'; +exports[1875] = 'ER_STOP_SLAVE_SQL_THREAD_TIMEOUT'; +exports[1876] = 'ER_STOP_SLAVE_IO_THREAD_TIMEOUT'; +exports[1877] = 'ER_TABLE_CORRUPT'; +exports[1878] = 'ER_TEMP_FILE_WRITE_FAILURE'; +exports[1879] = 'ER_INNODB_FT_AUX_NOT_HEX_ID'; +exports[1880] = 'ER_OLD_TEMPORALS_UPGRADED'; +exports[1881] = 'ER_INNODB_FORCED_RECOVERY'; +exports[1882] = 'ER_AES_INVALID_IV'; +exports[1883] = 'ER_PLUGIN_CANNOT_BE_UNINSTALLED'; +exports[1884] = 'ER_GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_GTID_GROUP'; +exports[1885] = 'ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER'; +exports[3000] = 'ER_FILE_CORRUPT'; +exports[3001] = 'ER_ERROR_ON_MASTER'; +exports[3002] = 'ER_INCONSISTENT_ERROR'; +exports[3003] = 'ER_STORAGE_ENGINE_NOT_LOADED'; +exports[3004] = 'ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER'; +exports[3005] = 'ER_WARN_LEGACY_SYNTAX_CONVERTED'; +exports[3006] = 'ER_BINLOG_UNSAFE_FULLTEXT_PLUGIN'; +exports[3007] = 'ER_CANNOT_DISCARD_TEMPORARY_TABLE'; +exports[3008] = 'ER_FK_DEPTH_EXCEEDED'; +exports[3009] = 'ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2'; +exports[3010] = 'ER_WARN_TRIGGER_DOESNT_HAVE_CREATED'; +exports[3011] = 'ER_REFERENCED_TRG_DOES_NOT_EXIST'; +exports[3012] = 'ER_EXPLAIN_NOT_SUPPORTED'; +exports[3013] = 'ER_INVALID_FIELD_SIZE'; +exports[3014] = 'ER_MISSING_HA_CREATE_OPTION'; +exports[3015] = 'ER_ENGINE_OUT_OF_MEMORY'; +exports[3016] = 'ER_PASSWORD_EXPIRE_ANONYMOUS_USER'; +exports[3017] = 'ER_SLAVE_SQL_THREAD_MUST_STOP'; +exports[3018] = 'ER_NO_FT_MATERIALIZED_SUBQUERY'; +exports[3019] = 'ER_INNODB_UNDO_LOG_FULL'; +exports[3020] = 'ER_INVALID_ARGUMENT_FOR_LOGARITHM'; +exports[3021] = 'ER_SLAVE_CHANNEL_IO_THREAD_MUST_STOP'; +exports[3022] = 'ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO'; +exports[3023] = 'ER_WARN_ONLY_MASTER_LOG_FILE_NO_POS'; +exports[3024] = 'ER_QUERY_TIMEOUT'; +exports[3025] = 'ER_NON_RO_SELECT_DISABLE_TIMER'; +exports[3026] = 'ER_DUP_LIST_ENTRY'; +exports[3027] = 'ER_SQL_MODE_NO_EFFECT'; +exports[3028] = 'ER_AGGREGATE_ORDER_FOR_UNION'; +exports[3029] = 'ER_AGGREGATE_ORDER_NON_AGG_QUERY'; +exports[3030] = 'ER_SLAVE_WORKER_STOPPED_PREVIOUS_THD_ERROR'; +exports[3031] = 'ER_DONT_SUPPORT_SLAVE_PRESERVE_COMMIT_ORDER'; +exports[3032] = 'ER_SERVER_OFFLINE_MODE'; +exports[3033] = 'ER_GIS_DIFFERENT_SRIDS'; +exports[3034] = 'ER_GIS_UNSUPPORTED_ARGUMENT'; +exports[3035] = 'ER_GIS_UNKNOWN_ERROR'; +exports[3036] = 'ER_GIS_UNKNOWN_EXCEPTION'; +exports[3037] = 'ER_GIS_INVALID_DATA'; +exports[3038] = 'ER_BOOST_GEOMETRY_EMPTY_INPUT_EXCEPTION'; +exports[3039] = 'ER_BOOST_GEOMETRY_CENTROID_EXCEPTION'; +exports[3040] = 'ER_BOOST_GEOMETRY_OVERLAY_INVALID_INPUT_EXCEPTION'; +exports[3041] = 'ER_BOOST_GEOMETRY_TURN_INFO_EXCEPTION'; +exports[3042] = 'ER_BOOST_GEOMETRY_SELF_INTERSECTION_POINT_EXCEPTION'; +exports[3043] = 'ER_BOOST_GEOMETRY_UNKNOWN_EXCEPTION'; +exports[3044] = 'ER_STD_BAD_ALLOC_ERROR'; +exports[3045] = 'ER_STD_DOMAIN_ERROR'; +exports[3046] = 'ER_STD_LENGTH_ERROR'; +exports[3047] = 'ER_STD_INVALID_ARGUMENT'; +exports[3048] = 'ER_STD_OUT_OF_RANGE_ERROR'; +exports[3049] = 'ER_STD_OVERFLOW_ERROR'; +exports[3050] = 'ER_STD_RANGE_ERROR'; +exports[3051] = 'ER_STD_UNDERFLOW_ERROR'; +exports[3052] = 'ER_STD_LOGIC_ERROR'; +exports[3053] = 'ER_STD_RUNTIME_ERROR'; +exports[3054] = 'ER_STD_UNKNOWN_EXCEPTION'; +exports[3055] = 'ER_GIS_DATA_WRONG_ENDIANESS'; +exports[3056] = 'ER_CHANGE_MASTER_PASSWORD_LENGTH'; +exports[3057] = 'ER_USER_LOCK_WRONG_NAME'; +exports[3058] = 'ER_USER_LOCK_DEADLOCK'; +exports[3059] = 'ER_REPLACE_INACCESSIBLE_ROWS'; +exports[3060] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_GIS'; +exports[3061] = 'ER_ILLEGAL_USER_VAR'; +exports[3062] = 'ER_GTID_MODE_OFF'; +exports[3063] = 'ER_UNSUPPORTED_BY_REPLICATION_THREAD'; +exports[3064] = 'ER_INCORRECT_TYPE'; +exports[3065] = 'ER_FIELD_IN_ORDER_NOT_SELECT'; +exports[3066] = 'ER_AGGREGATE_IN_ORDER_NOT_SELECT'; +exports[3067] = 'ER_INVALID_RPL_WILD_TABLE_FILTER_PATTERN'; +exports[3068] = 'ER_NET_OK_PACKET_TOO_LARGE'; +exports[3069] = 'ER_INVALID_JSON_DATA'; +exports[3070] = 'ER_INVALID_GEOJSON_MISSING_MEMBER'; +exports[3071] = 'ER_INVALID_GEOJSON_WRONG_TYPE'; +exports[3072] = 'ER_INVALID_GEOJSON_UNSPECIFIED'; +exports[3073] = 'ER_DIMENSION_UNSUPPORTED'; +exports[3074] = 'ER_SLAVE_CHANNEL_DOES_NOT_EXIST'; +exports[3075] = 'ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT'; +exports[3076] = 'ER_SLAVE_CHANNEL_NAME_INVALID_OR_TOO_LONG'; +exports[3077] = 'ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORY'; +exports[3078] = 'ER_SLAVE_CHANNEL_DELETE'; +exports[3079] = 'ER_SLAVE_MULTIPLE_CHANNELS_CMD'; +exports[3080] = 'ER_SLAVE_MAX_CHANNELS_EXCEEDED'; +exports[3081] = 'ER_SLAVE_CHANNEL_MUST_STOP'; +exports[3082] = 'ER_SLAVE_CHANNEL_NOT_RUNNING'; +exports[3083] = 'ER_SLAVE_CHANNEL_WAS_RUNNING'; +exports[3084] = 'ER_SLAVE_CHANNEL_WAS_NOT_RUNNING'; +exports[3085] = 'ER_SLAVE_CHANNEL_SQL_THREAD_MUST_STOP'; +exports[3086] = 'ER_SLAVE_CHANNEL_SQL_SKIP_COUNTER'; +exports[3087] = 'ER_WRONG_FIELD_WITH_GROUP_V2'; +exports[3088] = 'ER_MIX_OF_GROUP_FUNC_AND_FIELDS_V2'; +exports[3089] = 'ER_WARN_DEPRECATED_SYSVAR_UPDATE'; +exports[3090] = 'ER_WARN_DEPRECATED_SQLMODE'; +exports[3091] = 'ER_CANNOT_LOG_PARTIAL_DROP_DATABASE_WITH_GTID'; +exports[3092] = 'ER_GROUP_REPLICATION_CONFIGURATION'; +exports[3093] = 'ER_GROUP_REPLICATION_RUNNING'; +exports[3094] = 'ER_GROUP_REPLICATION_APPLIER_INIT_ERROR'; +exports[3095] = 'ER_GROUP_REPLICATION_STOP_APPLIER_THREAD_TIMEOUT'; +exports[3096] = 'ER_GROUP_REPLICATION_COMMUNICATION_LAYER_SESSION_ERROR'; +exports[3097] = 'ER_GROUP_REPLICATION_COMMUNICATION_LAYER_JOIN_ERROR'; +exports[3098] = 'ER_BEFORE_DML_VALIDATION_ERROR'; +exports[3099] = 'ER_PREVENTS_VARIABLE_WITHOUT_RBR'; +exports[3100] = 'ER_RUN_HOOK_ERROR'; +exports[3101] = 'ER_TRANSACTION_ROLLBACK_DURING_COMMIT'; +exports[3102] = 'ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED'; +exports[3103] = 'ER_UNSUPPORTED_ALTER_INPLACE_ON_VIRTUAL_COLUMN'; +exports[3104] = 'ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN'; +exports[3105] = 'ER_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN'; +exports[3106] = 'ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN'; +exports[3107] = 'ER_GENERATED_COLUMN_NON_PRIOR'; +exports[3108] = 'ER_DEPENDENT_BY_GENERATED_COLUMN'; +exports[3109] = 'ER_GENERATED_COLUMN_REF_AUTO_INC'; +exports[3110] = 'ER_FEATURE_NOT_AVAILABLE'; +exports[3111] = 'ER_CANT_SET_GTID_MODE'; +exports[3112] = 'ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF'; +exports[3113] = 'ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION'; +exports[3114] = 'ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON'; +exports[3115] = 'ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF'; +exports[3116] = 'ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS'; +exports[3117] = 'ER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS'; +exports[3118] = 'ER_ACCOUNT_HAS_BEEN_LOCKED'; +exports[3119] = 'ER_WRONG_TABLESPACE_NAME'; +exports[3120] = 'ER_TABLESPACE_IS_NOT_EMPTY'; +exports[3121] = 'ER_WRONG_FILE_NAME'; +exports[3122] = 'ER_BOOST_GEOMETRY_INCONSISTENT_TURNS_EXCEPTION'; +exports[3123] = 'ER_WARN_OPTIMIZER_HINT_SYNTAX_ERROR'; +exports[3124] = 'ER_WARN_BAD_MAX_EXECUTION_TIME'; +exports[3125] = 'ER_WARN_UNSUPPORTED_MAX_EXECUTION_TIME'; +exports[3126] = 'ER_WARN_CONFLICTING_HINT'; +exports[3127] = 'ER_WARN_UNKNOWN_QB_NAME'; +exports[3128] = 'ER_UNRESOLVED_HINT_NAME'; +exports[3129] = 'ER_WARN_ON_MODIFYING_GTID_EXECUTED_TABLE'; +exports[3130] = 'ER_PLUGGABLE_PROTOCOL_COMMAND_NOT_SUPPORTED'; +exports[3131] = 'ER_LOCKING_SERVICE_WRONG_NAME'; +exports[3132] = 'ER_LOCKING_SERVICE_DEADLOCK'; +exports[3133] = 'ER_LOCKING_SERVICE_TIMEOUT'; +exports[3134] = 'ER_GIS_MAX_POINTS_IN_GEOMETRY_OVERFLOWED'; +exports[3135] = 'ER_SQL_MODE_MERGED'; +exports[3136] = 'ER_VTOKEN_PLUGIN_TOKEN_MISMATCH'; +exports[3137] = 'ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND'; +exports[3138] = 'ER_CANT_SET_VARIABLE_WHEN_OWNING_GTID'; +exports[3139] = 'ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED'; +exports[3140] = 'ER_INVALID_JSON_TEXT'; +exports[3141] = 'ER_INVALID_JSON_TEXT_IN_PARAM'; +exports[3142] = 'ER_INVALID_JSON_BINARY_DATA'; +exports[3143] = 'ER_INVALID_JSON_PATH'; +exports[3144] = 'ER_INVALID_JSON_CHARSET'; +exports[3145] = 'ER_INVALID_JSON_CHARSET_IN_FUNCTION'; +exports[3146] = 'ER_INVALID_TYPE_FOR_JSON'; +exports[3147] = 'ER_INVALID_CAST_TO_JSON'; +exports[3148] = 'ER_INVALID_JSON_PATH_CHARSET'; +exports[3149] = 'ER_INVALID_JSON_PATH_WILDCARD'; +exports[3150] = 'ER_JSON_VALUE_TOO_BIG'; +exports[3151] = 'ER_JSON_KEY_TOO_BIG'; +exports[3152] = 'ER_JSON_USED_AS_KEY'; +exports[3153] = 'ER_JSON_VACUOUS_PATH'; +exports[3154] = 'ER_JSON_BAD_ONE_OR_ALL_ARG'; +exports[3155] = 'ER_NUMERIC_JSON_VALUE_OUT_OF_RANGE'; +exports[3156] = 'ER_INVALID_JSON_VALUE_FOR_CAST'; +exports[3157] = 'ER_JSON_DOCUMENT_TOO_DEEP'; +exports[3158] = 'ER_JSON_DOCUMENT_NULL_KEY'; +exports[3159] = 'ER_SECURE_TRANSPORT_REQUIRED'; +exports[3160] = 'ER_NO_SECURE_TRANSPORTS_CONFIGURED'; +exports[3161] = 'ER_DISABLED_STORAGE_ENGINE'; +exports[3162] = 'ER_USER_DOES_NOT_EXIST'; +exports[3163] = 'ER_USER_ALREADY_EXISTS'; +exports[3164] = 'ER_AUDIT_API_ABORT'; +exports[3165] = 'ER_INVALID_JSON_PATH_ARRAY_CELL'; +exports[3166] = 'ER_BUFPOOL_RESIZE_INPROGRESS'; +exports[3167] = 'ER_FEATURE_DISABLED_SEE_DOC'; +exports[3168] = 'ER_SERVER_ISNT_AVAILABLE'; +exports[3169] = 'ER_SESSION_WAS_KILLED'; +exports[3170] = 'ER_CAPACITY_EXCEEDED'; +exports[3171] = 'ER_CAPACITY_EXCEEDED_IN_RANGE_OPTIMIZER'; +exports[3172] = 'ER_TABLE_NEEDS_UPG_PART'; +exports[3173] = 'ER_CANT_WAIT_FOR_EXECUTED_GTID_SET_WHILE_OWNING_A_GTID'; +exports[3174] = 'ER_CANNOT_ADD_FOREIGN_BASE_COL_VIRTUAL'; +exports[3175] = 'ER_CANNOT_CREATE_VIRTUAL_INDEX_CONSTRAINT'; +exports[3176] = 'ER_ERROR_ON_MODIFYING_GTID_EXECUTED_TABLE'; +exports[3177] = 'ER_LOCK_REFUSED_BY_ENGINE'; +exports[3178] = 'ER_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN'; +exports[3179] = 'ER_MASTER_KEY_ROTATION_NOT_SUPPORTED_BY_SE'; +exports[3180] = 'ER_MASTER_KEY_ROTATION_ERROR_BY_SE'; +exports[3181] = 'ER_MASTER_KEY_ROTATION_BINLOG_FAILED'; +exports[3182] = 'ER_MASTER_KEY_ROTATION_SE_UNAVAILABLE'; +exports[3183] = 'ER_TABLESPACE_CANNOT_ENCRYPT'; +exports[3184] = 'ER_INVALID_ENCRYPTION_OPTION'; +exports[3185] = 'ER_CANNOT_FIND_KEY_IN_KEYRING'; +exports[3186] = 'ER_CAPACITY_EXCEEDED_IN_PARSER'; +exports[3187] = 'ER_UNSUPPORTED_ALTER_ENCRYPTION_INPLACE'; +exports[3188] = 'ER_KEYRING_UDF_KEYRING_SERVICE_ERROR'; +exports[3189] = 'ER_USER_COLUMN_OLD_LENGTH'; +exports[3190] = 'ER_CANT_RESET_MASTER'; +exports[3191] = 'ER_GROUP_REPLICATION_MAX_GROUP_SIZE'; +exports[3192] = 'ER_CANNOT_ADD_FOREIGN_BASE_COL_STORED'; +exports[3193] = 'ER_TABLE_REFERENCED'; +exports[3194] = 'ER_PARTITION_ENGINE_DEPRECATED_FOR_TABLE'; +exports[3195] = 'ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO'; +exports[3196] = 'ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID'; +exports[3197] = 'ER_XA_RETRY'; +exports[3198] = 'ER_KEYRING_AWS_UDF_AWS_KMS_ERROR'; +exports[3199] = 'ER_BINLOG_UNSAFE_XA'; +exports[3200] = 'ER_UDF_ERROR'; +exports[3201] = 'ER_KEYRING_MIGRATION_FAILURE'; +exports[3202] = 'ER_KEYRING_ACCESS_DENIED_ERROR'; +exports[3203] = 'ER_KEYRING_MIGRATION_STATUS'; + + +/***/ }), +/* 65 */ +/***/ (function(module, exports, __webpack_require__) { + +var Timers = __webpack_require__(66); + +module.exports = Timer; +function Timer(object) { + this._object = object; + this._timeout = null; +} + +Timer.prototype.active = function active() { + if (this._timeout) { + if (this._timeout.refresh) { + this._timeout.refresh(); + } else { + Timers.active(this._timeout); + } + } +}; + +Timer.prototype.start = function start(msecs) { + this.stop(); + this._timeout = Timers.setTimeout(this._onTimeout.bind(this), msecs); +}; + +Timer.prototype.stop = function stop() { + if (this._timeout) { + Timers.clearTimeout(this._timeout); + this._timeout = null; + } +}; + +Timer.prototype._onTimeout = function _onTimeout() { + return this._object._onTimeout(); +}; + + +/***/ }), +/* 66 */ +/***/ (function(module, exports) { + +module.exports = require("timers"); + +/***/ }), +/* 67 */ +/***/ (function(module, exports, __webpack_require__) { + +var Sequence = __webpack_require__(3); +var Util = __webpack_require__(0); +var Packets = __webpack_require__(2); +var Auth = __webpack_require__(18); +var ClientConstants = __webpack_require__(9); + +module.exports = Handshake; +Util.inherits(Handshake, Sequence); +function Handshake(options, callback) { + Sequence.call(this, options, callback); + + options = options || {}; + + this._config = options.config; + this._handshakeInitializationPacket = null; +} + +Handshake.prototype.determinePacket = function determinePacket(firstByte, parser) { + if (firstByte === 0xff) { + return Packets.ErrorPacket; + } + + if (!this._handshakeInitializationPacket) { + return Packets.HandshakeInitializationPacket; + } + + if (firstByte === 0xfe) { + return (parser.packetLength() === 1) + ? Packets.UseOldPasswordPacket + : Packets.AuthSwitchRequestPacket; + } + + return undefined; +}; + +Handshake.prototype['AuthSwitchRequestPacket'] = function (packet) { + if (packet.authMethodName === 'mysql_native_password') { + var challenge = packet.authMethodData.slice(0, 20); + + this.emit('packet', new Packets.AuthSwitchResponsePacket({ + data: Auth.token(this._config.password, challenge) + })); + } else { + var err = new Error( + 'MySQL is requesting the ' + packet.authMethodName + ' authentication method, which is not supported.' + ); + + err.code = 'UNSUPPORTED_AUTH_METHOD'; + err.fatal = true; + + this.end(err); + } +}; + +Handshake.prototype['HandshakeInitializationPacket'] = function(packet) { + this._handshakeInitializationPacket = packet; + + this._config.protocol41 = packet.protocol41; + + var serverSSLSupport = packet.serverCapabilities1 & ClientConstants.CLIENT_SSL; + + if (this._config.ssl) { + if (!serverSSLSupport) { + var err = new Error('Server does not support secure connection'); + + err.code = 'HANDSHAKE_NO_SSL_SUPPORT'; + err.fatal = true; + + this.end(err); + return; + } + + this._config.clientFlags |= ClientConstants.CLIENT_SSL; + this.emit('packet', new Packets.SSLRequestPacket({ + clientFlags : this._config.clientFlags, + maxPacketSize : this._config.maxPacketSize, + charsetNumber : this._config.charsetNumber + })); + this.emit('start-tls'); + } else { + this._sendCredentials(); + } +}; + +Handshake.prototype._tlsUpgradeCompleteHandler = function() { + this._sendCredentials(); +}; + +Handshake.prototype._sendCredentials = function() { + var packet = this._handshakeInitializationPacket; + this.emit('packet', new Packets.ClientAuthenticationPacket({ + clientFlags : this._config.clientFlags, + maxPacketSize : this._config.maxPacketSize, + charsetNumber : this._config.charsetNumber, + user : this._config.user, + database : this._config.database, + protocol41 : packet.protocol41, + scrambleBuff : (packet.protocol41) + ? Auth.token(this._config.password, packet.scrambleBuff()) + : Auth.scramble323(packet.scrambleBuff(), this._config.password) + })); +}; + +Handshake.prototype['UseOldPasswordPacket'] = function() { + if (!this._config.insecureAuth) { + var err = new Error( + 'MySQL server is requesting the old and insecure pre-4.1 auth mechanism. ' + + 'Upgrade the user password or use the {insecureAuth: true} option.' + ); + + err.code = 'HANDSHAKE_INSECURE_AUTH'; + err.fatal = true; + + this.end(err); + return; + } + + this.emit('packet', new Packets.OldPasswordPacket({ + scrambleBuff: Auth.scramble323(this._handshakeInitializationPacket.scrambleBuff(), this._config.password) + })); +}; + +Handshake.prototype['ErrorPacket'] = function(packet) { + var err = this._packetToError(packet, true); + err.fatal = true; + this.end(err); +}; + + +/***/ }), +/* 68 */ +/***/ (function(module, exports, __webpack_require__) { + +var Sequence = __webpack_require__(3); +var Util = __webpack_require__(0); +var Packets = __webpack_require__(2); + +module.exports = Ping; +Util.inherits(Ping, Sequence); + +function Ping(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + Sequence.call(this, options, callback); +} + +Ping.prototype.start = function() { + this.emit('packet', new Packets.ComPingPacket()); +}; + + +/***/ }), +/* 69 */ +/***/ (function(module, exports) { + +module.exports = ResultSet; +function ResultSet(resultSetHeaderPacket) { + this.resultSetHeaderPacket = resultSetHeaderPacket; + this.fieldPackets = []; + this.eofPackets = []; + this.rows = []; +} + + +/***/ }), +/* 70 */ +/***/ (function(module, exports) { + +// Manually extracted from mysql-5.5.23/include/mysql_com.h + +/** + Is raised when a multi-statement transaction + has been started, either explicitly, by means + of BEGIN or COMMIT AND CHAIN, or + implicitly, by the first transactional + statement, when autocommit=off. +*/ +exports.SERVER_STATUS_IN_TRANS = 1; +exports.SERVER_STATUS_AUTOCOMMIT = 2; /* Server in auto_commit mode */ +exports.SERVER_MORE_RESULTS_EXISTS = 8; /* Multi query - next query exists */ +exports.SERVER_QUERY_NO_GOOD_INDEX_USED = 16; +exports.SERVER_QUERY_NO_INDEX_USED = 32; +/** + The server was able to fulfill the clients request and opened a + read-only non-scrollable cursor for a query. This flag comes + in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands. +*/ +exports.SERVER_STATUS_CURSOR_EXISTS = 64; +/** + This flag is sent when a read-only cursor is exhausted, in reply to + COM_STMT_FETCH command. +*/ +exports.SERVER_STATUS_LAST_ROW_SENT = 128; +exports.SERVER_STATUS_DB_DROPPED = 256; /* A database was dropped */ +exports.SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512; +/** + Sent to the client if after a prepared statement reprepare + we discovered that the new statement returns a different + number of result set columns. +*/ +exports.SERVER_STATUS_METADATA_CHANGED = 1024; +exports.SERVER_QUERY_WAS_SLOW = 2048; + +/** + To mark ResultSet containing output parameter values. +*/ +exports.SERVER_PS_OUT_PARAMS = 4096; + + +/***/ }), +/* 71 */ +/***/ (function(module, exports) { + +module.exports = require("fs"); + +/***/ }), +/* 72 */ +/***/ (function(module, exports, __webpack_require__) { + +var Stream = __webpack_require__(13); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = __webpack_require__(20); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = __webpack_require__(23); + exports.Duplex = __webpack_require__(5); + exports.Transform = __webpack_require__(25); + exports.PassThrough = __webpack_require__(77); +} + + +/***/ }), +/* 73 */ +/***/ (function(module, exports) { + +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; + + +/***/ }), +/* 74 */ +/***/ (function(module, exports) { + +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + + +/***/ }), +/* 75 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = __webpack_require__(1).Buffer; +var util = __webpack_require__(0); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} + +/***/ }), +/* 76 */ +/***/ (function(module, exports, __webpack_require__) { + + +/** + * For Node.js, simply re-export the core `util.deprecate` function. + */ + +module.exports = __webpack_require__(0).deprecate; + + +/***/ }), +/* 77 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + + + +module.exports = PassThrough; + +var Transform = __webpack_require__(25); + +/**/ +var util = __webpack_require__(6); +util.inherits = __webpack_require__(7); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; + +/***/ }), +/* 78 */ +/***/ (function(module, exports, __webpack_require__) { + +var Sequence = __webpack_require__(3); +var Util = __webpack_require__(0); +var Packets = __webpack_require__(2); + +module.exports = Quit; +Util.inherits(Quit, Sequence); +function Quit(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + Sequence.call(this, options, callback); + + this._started = false; +} + +Quit.prototype.end = function end(err) { + if (this._ended) { + return; + } + + if (!this._started) { + Sequence.prototype.end.call(this, err); + return; + } + + if (err && err.code === 'ECONNRESET' && err.syscall === 'read') { + // Ignore read errors after packet sent + Sequence.prototype.end.call(this); + return; + } + + Sequence.prototype.end.call(this, err); +}; + +Quit.prototype.start = function() { + this._started = true; + this.emit('packet', new Packets.ComQuitPacket()); +}; + + +/***/ }), +/* 79 */ +/***/ (function(module, exports, __webpack_require__) { + +var Sequence = __webpack_require__(3); +var Util = __webpack_require__(0); +var Packets = __webpack_require__(2); + +module.exports = Statistics; +Util.inherits(Statistics, Sequence); +function Statistics(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + Sequence.call(this, options, callback); +} + +Statistics.prototype.start = function() { + this.emit('packet', new Packets.ComStatisticsPacket()); +}; + +Statistics.prototype['StatisticsPacket'] = function (packet) { + this.end(null, packet); +}; + +Statistics.prototype.determinePacket = function determinePacket(firstByte) { + if (firstByte === 0x55) { + return Packets.StatisticsPacket; + } + + return undefined; +}; + + +/***/ }), +/* 80 */ +/***/ (function(module, exports, __webpack_require__) { + +var BIT_16 = Math.pow(2, 16); +var BIT_24 = Math.pow(2, 24); +var BUFFER_ALLOC_SIZE = Math.pow(2, 8); +// The maximum precision JS Numbers can hold precisely +// Don't panic: Good enough to represent byte values up to 8192 TB +var IEEE_754_BINARY_64_PRECISION = Math.pow(2, 53); +var MAX_PACKET_LENGTH = Math.pow(2, 24) - 1; +var Buffer = __webpack_require__(1).Buffer; + +module.exports = PacketWriter; +function PacketWriter() { + this._buffer = null; + this._offset = 0; +} + +PacketWriter.prototype.toBuffer = function toBuffer(parser) { + if (!this._buffer) { + this._buffer = Buffer.alloc(0); + this._offset = 0; + } + + var buffer = this._buffer; + var length = this._offset; + var packets = Math.floor(length / MAX_PACKET_LENGTH) + 1; + + this._buffer = Buffer.allocUnsafe(length + packets * 4); + this._offset = 0; + + for (var packet = 0; packet < packets; packet++) { + var isLast = (packet + 1 === packets); + var packetLength = (isLast) + ? length % MAX_PACKET_LENGTH + : MAX_PACKET_LENGTH; + + var packetNumber = parser.incrementPacketNumber(); + + this.writeUnsignedNumber(3, packetLength); + this.writeUnsignedNumber(1, packetNumber); + + var start = packet * MAX_PACKET_LENGTH; + var end = start + packetLength; + + this.writeBuffer(buffer.slice(start, end)); + } + + return this._buffer; +}; + +PacketWriter.prototype.writeUnsignedNumber = function(bytes, value) { + this._allocate(bytes); + + for (var i = 0; i < bytes; i++) { + this._buffer[this._offset++] = (value >> (i * 8)) & 0xff; + } +}; + +PacketWriter.prototype.writeFiller = function(bytes) { + this._allocate(bytes); + + for (var i = 0; i < bytes; i++) { + this._buffer[this._offset++] = 0x00; + } +}; + +PacketWriter.prototype.writeNullTerminatedString = function(value, encoding) { + // Typecast undefined into '' and numbers into strings + value = value || ''; + value = value + ''; + + var bytes = Buffer.byteLength(value, encoding || 'utf-8') + 1; + this._allocate(bytes); + + this._buffer.write(value, this._offset, encoding); + this._buffer[this._offset + bytes - 1] = 0x00; + + this._offset += bytes; +}; + +PacketWriter.prototype.writeString = function(value) { + // Typecast undefined into '' and numbers into strings + value = value || ''; + value = value + ''; + + var bytes = Buffer.byteLength(value, 'utf-8'); + this._allocate(bytes); + + this._buffer.write(value, this._offset, 'utf-8'); + + this._offset += bytes; +}; + +PacketWriter.prototype.writeBuffer = function(value) { + var bytes = value.length; + + this._allocate(bytes); + value.copy(this._buffer, this._offset); + this._offset += bytes; +}; + +PacketWriter.prototype.writeLengthCodedNumber = function(value) { + if (value === null) { + this._allocate(1); + this._buffer[this._offset++] = 251; + return; + } + + if (value <= 250) { + this._allocate(1); + this._buffer[this._offset++] = value; + return; + } + + if (value > IEEE_754_BINARY_64_PRECISION) { + throw new Error( + 'writeLengthCodedNumber: JS precision range exceeded, your ' + + 'number is > 53 bit: "' + value + '"' + ); + } + + if (value < BIT_16) { + this._allocate(3); + this._buffer[this._offset++] = 252; + } else if (value < BIT_24) { + this._allocate(4); + this._buffer[this._offset++] = 253; + } else { + this._allocate(9); + this._buffer[this._offset++] = 254; + } + + // 16 Bit + this._buffer[this._offset++] = value & 0xff; + this._buffer[this._offset++] = (value >> 8) & 0xff; + + if (value < BIT_16) { + return; + } + + // 24 Bit + this._buffer[this._offset++] = (value >> 16) & 0xff; + + if (value < BIT_24) { + return; + } + + this._buffer[this._offset++] = (value >> 24) & 0xff; + + // Hack: Get the most significant 32 bit (JS bitwise operators are 32 bit) + value = value.toString(2); + value = value.substr(0, value.length - 32); + value = parseInt(value, 2); + + this._buffer[this._offset++] = value & 0xff; + this._buffer[this._offset++] = (value >> 8) & 0xff; + this._buffer[this._offset++] = (value >> 16) & 0xff; + + // Set last byte to 0, as we can only support 53 bits in JS (see above) + this._buffer[this._offset++] = 0; +}; + +PacketWriter.prototype.writeLengthCodedBuffer = function(value) { + var bytes = value.length; + this.writeLengthCodedNumber(bytes); + this.writeBuffer(value); +}; + +PacketWriter.prototype.writeNullTerminatedBuffer = function(value) { + this.writeBuffer(value); + this.writeFiller(1); // 0x00 terminator +}; + +PacketWriter.prototype.writeLengthCodedString = function(value) { + if (value === null) { + this.writeLengthCodedNumber(null); + return; + } + + value = (value === undefined) + ? '' + : String(value); + + var bytes = Buffer.byteLength(value, 'utf-8'); + this.writeLengthCodedNumber(bytes); + + if (!bytes) { + return; + } + + this._allocate(bytes); + this._buffer.write(value, this._offset, 'utf-8'); + this._offset += bytes; +}; + +PacketWriter.prototype._allocate = function _allocate(bytes) { + if (!this._buffer) { + this._buffer = Buffer.alloc(Math.max(BUFFER_ALLOC_SIZE, bytes)); + this._offset = 0; + return; + } + + var bytesRemaining = this._buffer.length - this._offset; + if (bytesRemaining >= bytes) { + return; + } + + var newSize = this._buffer.length + Math.max(BUFFER_ALLOC_SIZE, bytes); + var oldBuffer = this._buffer; + + this._buffer = Buffer.alloc(newSize); + oldBuffer.copy(this._buffer); +}; + + +/***/ }), +/* 81 */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(82); + + +/***/ }), +/* 82 */ +/***/ (function(module, exports) { + +var SqlString = exports; + +var ID_GLOBAL_REGEXP = /`/g; +var QUAL_GLOBAL_REGEXP = /\./g; +var CHARS_GLOBAL_REGEXP = /[\0\b\t\n\r\x1a\"\'\\]/g; // eslint-disable-line no-control-regex +var CHARS_ESCAPE_MAP = { + '\0' : '\\0', + '\b' : '\\b', + '\t' : '\\t', + '\n' : '\\n', + '\r' : '\\r', + '\x1a' : '\\Z', + '"' : '\\"', + '\'' : '\\\'', + '\\' : '\\\\' +}; + +SqlString.escapeId = function escapeId(val, forbidQualified) { + if (Array.isArray(val)) { + var sql = ''; + + for (var i = 0; i < val.length; i++) { + sql += (i === 0 ? '' : ', ') + SqlString.escapeId(val[i], forbidQualified); + } + + return sql; + } else if (forbidQualified) { + return '`' + String(val).replace(ID_GLOBAL_REGEXP, '``') + '`'; + } else { + return '`' + String(val).replace(ID_GLOBAL_REGEXP, '``').replace(QUAL_GLOBAL_REGEXP, '`.`') + '`'; + } +}; + +SqlString.escape = function escape(val, stringifyObjects, timeZone) { + if (val === undefined || val === null) { + return 'NULL'; + } + + switch (typeof val) { + case 'boolean': return (val) ? 'true' : 'false'; + case 'number': return val + ''; + case 'object': + if (val instanceof Date) { + return SqlString.dateToString(val, timeZone || 'local'); + } else if (Array.isArray(val)) { + return SqlString.arrayToList(val, timeZone); + } else if (Buffer.isBuffer(val)) { + return SqlString.bufferToString(val); + } else if (typeof val.toSqlString === 'function') { + return String(val.toSqlString()); + } else if (stringifyObjects) { + return escapeString(val.toString()); + } else { + return SqlString.objectToValues(val, timeZone); + } + default: return escapeString(val); + } +}; + +SqlString.arrayToList = function arrayToList(array, timeZone) { + var sql = ''; + + for (var i = 0; i < array.length; i++) { + var val = array[i]; + + if (Array.isArray(val)) { + sql += (i === 0 ? '' : ', ') + '(' + SqlString.arrayToList(val, timeZone) + ')'; + } else { + sql += (i === 0 ? '' : ', ') + SqlString.escape(val, true, timeZone); + } + } + + return sql; +}; + +SqlString.format = function format(sql, values, stringifyObjects, timeZone) { + if (values == null) { + return sql; + } + + if (!(values instanceof Array || Array.isArray(values))) { + values = [values]; + } + + var chunkIndex = 0; + var placeholdersRegex = /\?+/g; + var result = ''; + var valuesIndex = 0; + var match; + + while (valuesIndex < values.length && (match = placeholdersRegex.exec(sql))) { + var len = match[0].length; + + if (len > 2) { + continue; + } + + var value = len === 2 + ? SqlString.escapeId(values[valuesIndex]) + : SqlString.escape(values[valuesIndex], stringifyObjects, timeZone); + + result += sql.slice(chunkIndex, match.index) + value; + chunkIndex = placeholdersRegex.lastIndex; + valuesIndex++; + } + + if (chunkIndex === 0) { + // Nothing was replaced + return sql; + } + + if (chunkIndex < sql.length) { + return result + sql.slice(chunkIndex); + } + + return result; +}; + +SqlString.dateToString = function dateToString(date, timeZone) { + var dt = new Date(date); + + if (isNaN(dt.getTime())) { + return 'NULL'; + } + + var year; + var month; + var day; + var hour; + var minute; + var second; + var millisecond; + + if (timeZone === 'local') { + year = dt.getFullYear(); + month = dt.getMonth() + 1; + day = dt.getDate(); + hour = dt.getHours(); + minute = dt.getMinutes(); + second = dt.getSeconds(); + millisecond = dt.getMilliseconds(); + } else { + var tz = convertTimezone(timeZone); + + if (tz !== false && tz !== 0) { + dt.setTime(dt.getTime() + (tz * 60000)); + } + + year = dt.getUTCFullYear(); + month = dt.getUTCMonth() + 1; + day = dt.getUTCDate(); + hour = dt.getUTCHours(); + minute = dt.getUTCMinutes(); + second = dt.getUTCSeconds(); + millisecond = dt.getUTCMilliseconds(); + } + + // YYYY-MM-DD HH:mm:ss.mmm + var str = zeroPad(year, 4) + '-' + zeroPad(month, 2) + '-' + zeroPad(day, 2) + ' ' + + zeroPad(hour, 2) + ':' + zeroPad(minute, 2) + ':' + zeroPad(second, 2) + '.' + + zeroPad(millisecond, 3); + + return escapeString(str); +}; + +SqlString.bufferToString = function bufferToString(buffer) { + return 'X' + escapeString(buffer.toString('hex')); +}; + +SqlString.objectToValues = function objectToValues(object, timeZone) { + var sql = ''; + + for (var key in object) { + var val = object[key]; + + if (typeof val === 'function') { + continue; + } + + sql += (sql.length === 0 ? '' : ', ') + SqlString.escapeId(key) + ' = ' + SqlString.escape(val, true, timeZone); + } + + return sql; +}; + +SqlString.raw = function raw(sql) { + if (typeof sql !== 'string') { + throw new TypeError('argument sql must be a string'); + } + + return { + toSqlString: function toSqlString() { return sql; } + }; +}; + +function escapeString(val) { + var chunkIndex = CHARS_GLOBAL_REGEXP.lastIndex = 0; + var escapedVal = ''; + var match; + + while ((match = CHARS_GLOBAL_REGEXP.exec(val))) { + escapedVal += val.slice(chunkIndex, match.index) + CHARS_ESCAPE_MAP[match[0]]; + chunkIndex = CHARS_GLOBAL_REGEXP.lastIndex; + } + + if (chunkIndex === 0) { + // Nothing was escaped + return "'" + val + "'"; + } + + if (chunkIndex < val.length) { + return "'" + escapedVal + val.slice(chunkIndex) + "'"; + } + + return "'" + escapedVal + "'"; +} + +function zeroPad(number, length) { + number = number.toString(); + while (number.length < length) { + number = '0' + number; + } + + return number; +} + +function convertTimezone(tz) { + if (tz === 'Z') { + return 0; + } + + var m = tz.match(/([\+\-\s])(\d\d):?(\d\d)?/); + if (m) { + return (m[1] === '-' ? -1 : 1) * (parseInt(m[2], 10) + ((m[3] ? parseInt(m[3], 10) : 0) / 60)) * 60; + } + return false; +} + + +/***/ }), +/* 83 */ +/***/ (function(module, exports, __webpack_require__) { + +var inherits = __webpack_require__(0).inherits; +var Connection = __webpack_require__(8); +var Events = __webpack_require__(4); + +module.exports = PoolConnection; +inherits(PoolConnection, Connection); + +function PoolConnection(pool, options) { + Connection.call(this, options); + this._pool = pool; + + // Bind connection to pool domain + if (Events.usingDomains) { + this.domain = pool.domain; + } + + // When a fatal error occurs the connection's protocol ends, which will cause + // the connection to end as well, thus we only need to watch for the end event + // and we will be notified of disconnects. + this.on('end', this._removeFromPool); + this.on('error', function (err) { + if (err.fatal) { + this._removeFromPool(); + } + }); +} + +PoolConnection.prototype.release = function release() { + var pool = this._pool; + + if (!pool || pool._closed) { + return undefined; + } + + return pool.releaseConnection(this); +}; + +// TODO: Remove this when we are removing PoolConnection#end +PoolConnection.prototype._realEnd = Connection.prototype.end; + +PoolConnection.prototype.end = function () { + console.warn( + 'Calling conn.end() to release a pooled connection is ' + + 'deprecated. In next version calling conn.end() will be ' + + 'restored to default conn.end() behavior. Use ' + + 'conn.release() instead.' + ); + this.release(); +}; + +PoolConnection.prototype.destroy = function () { + Connection.prototype.destroy.apply(this, arguments); + this._removeFromPool(this); +}; + +PoolConnection.prototype._removeFromPool = function _removeFromPool() { + if (!this._pool || this._pool._closed) { + return; + } + + var pool = this._pool; + this._pool = null; + + pool._purgeConnection(this); +}; + + +/***/ }), +/* 84 */ +/***/ (function(module, exports, __webpack_require__) { + +var Pool = __webpack_require__(27); +var PoolConfig = __webpack_require__(28); +var PoolNamespace = __webpack_require__(85); +var PoolSelector = __webpack_require__(29); +var Util = __webpack_require__(0); +var EventEmitter = __webpack_require__(4).EventEmitter; + +module.exports = PoolCluster; + +/** + * PoolCluster + * @constructor + * @param {object} [config] The pool cluster configuration + * @public + */ +function PoolCluster(config) { + EventEmitter.call(this); + + config = config || {}; + this._canRetry = typeof config.canRetry === 'undefined' ? true : config.canRetry; + this._defaultSelector = config.defaultSelector || 'RR'; + this._removeNodeErrorCount = config.removeNodeErrorCount || 5; + this._restoreNodeTimeout = config.restoreNodeTimeout || 0; + + this._closed = false; + this._findCaches = Object.create(null); + this._lastId = 0; + this._namespaces = Object.create(null); + this._nodes = Object.create(null); +} + +Util.inherits(PoolCluster, EventEmitter); + +PoolCluster.prototype.add = function add(id, config) { + if (this._closed) { + throw new Error('PoolCluster is closed.'); + } + + var nodeId = typeof id === 'object' + ? 'CLUSTER::' + (++this._lastId) + : String(id); + + if (this._nodes[nodeId] !== undefined) { + throw new Error('Node ID "' + nodeId + '" is already defined in PoolCluster.'); + } + + var poolConfig = typeof id !== 'object' + ? new PoolConfig(config) + : new PoolConfig(id); + + this._nodes[nodeId] = { + id : nodeId, + errorCount : 0, + pool : new Pool({config: poolConfig}), + _offlineUntil : 0 + }; + + this._clearFindCaches(); +}; + +PoolCluster.prototype.end = function end(callback) { + var cb = callback !== undefined + ? callback + : _cb; + + if (typeof cb !== 'function') { + throw TypeError('callback argument must be a function'); + } + + if (this._closed) { + process.nextTick(cb); + return; + } + + this._closed = true; + + var calledBack = false; + var nodeIds = Object.keys(this._nodes); + var waitingClose = 0; + + function onEnd(err) { + if (!calledBack && (err || --waitingClose <= 0)) { + calledBack = true; + cb(err); + } + } + + for (var i = 0; i < nodeIds.length; i++) { + var nodeId = nodeIds[i]; + var node = this._nodes[nodeId]; + + waitingClose++; + node.pool.end(onEnd); + } + + if (waitingClose === 0) { + process.nextTick(onEnd); + } +}; + +PoolCluster.prototype.of = function(pattern, selector) { + pattern = pattern || '*'; + + selector = selector || this._defaultSelector; + selector = selector.toUpperCase(); + if (typeof PoolSelector[selector] === 'undefined') { + selector = this._defaultSelector; + } + + var key = pattern + selector; + + if (typeof this._namespaces[key] === 'undefined') { + this._namespaces[key] = new PoolNamespace(this, pattern, selector); + } + + return this._namespaces[key]; +}; + +PoolCluster.prototype.remove = function remove(pattern) { + var foundNodeIds = this._findNodeIds(pattern, true); + + for (var i = 0; i < foundNodeIds.length; i++) { + var node = this._getNode(foundNodeIds[i]); + + if (node) { + this._removeNode(node); + } + } +}; + +PoolCluster.prototype.getConnection = function(pattern, selector, cb) { + var namespace; + if (typeof pattern === 'function') { + cb = pattern; + namespace = this.of(); + } else { + if (typeof selector === 'function') { + cb = selector; + selector = this._defaultSelector; + } + + namespace = this.of(pattern, selector); + } + + namespace.getConnection(cb); +}; + +PoolCluster.prototype._clearFindCaches = function _clearFindCaches() { + this._findCaches = Object.create(null); +}; + +PoolCluster.prototype._decreaseErrorCount = function _decreaseErrorCount(node) { + var errorCount = node.errorCount; + + if (errorCount > this._removeNodeErrorCount) { + errorCount = this._removeNodeErrorCount; + } + + if (errorCount < 1) { + errorCount = 1; + } + + node.errorCount = errorCount - 1; + + if (node._offlineUntil) { + node._offlineUntil = 0; + this.emit('online', node.id); + } +}; + +PoolCluster.prototype._findNodeIds = function _findNodeIds(pattern, includeOffline) { + var currentTime = 0; + var foundNodeIds = this._findCaches[pattern]; + + if (foundNodeIds === undefined) { + var expression = patternRegExp(pattern); + var nodeIds = Object.keys(this._nodes); + + foundNodeIds = nodeIds.filter(function (id) { + return id.match(expression); + }); + + this._findCaches[pattern] = foundNodeIds; + } + + if (includeOffline) { + return foundNodeIds; + } + + return foundNodeIds.filter(function (nodeId) { + var node = this._getNode(nodeId); + + if (!node._offlineUntil) { + return true; + } + + if (!currentTime) { + currentTime = getMonotonicMilliseconds(); + } + + return node._offlineUntil <= currentTime; + }, this); +}; + +PoolCluster.prototype._getNode = function _getNode(id) { + return this._nodes[id] || null; +}; + +PoolCluster.prototype._increaseErrorCount = function _increaseErrorCount(node) { + var errorCount = ++node.errorCount; + + if (this._removeNodeErrorCount > errorCount) { + return; + } + + if (this._restoreNodeTimeout > 0) { + node._offlineUntil = getMonotonicMilliseconds() + this._restoreNodeTimeout; + this.emit('offline', node.id); + return; + } + + this._removeNode(node); + this.emit('remove', node.id); +}; + +PoolCluster.prototype._getConnection = function(node, cb) { + var self = this; + + node.pool.getConnection(function (err, connection) { + if (err) { + self._increaseErrorCount(node); + cb(err); + return; + } else { + self._decreaseErrorCount(node); + } + + connection._clusterId = node.id; + + cb(null, connection); + }); +}; + +PoolCluster.prototype._removeNode = function _removeNode(node) { + delete this._nodes[node.id]; + + this._clearFindCaches(); + + node.pool.end(_noop); +}; + +function getMonotonicMilliseconds() { + var ms; + + if (typeof process.hrtime === 'function') { + ms = process.hrtime(); + ms = ms[0] * 1e3 + ms[1] * 1e-6; + } else { + ms = process.uptime() * 1000; + } + + return Math.floor(ms); +} + +function isRegExp(val) { + return typeof val === 'object' + && Object.prototype.toString.call(val) === '[object RegExp]'; +} + +function patternRegExp(pattern) { + if (isRegExp(pattern)) { + return pattern; + } + + var source = pattern + .replace(/([.+?^=!:${}()|\[\]\/\\])/g, '\\$1') + .replace(/\*/g, '.*'); + + return new RegExp('^' + source + '$'); +} + +function _cb(err) { + if (err) { + throw err; + } +} + +function _noop() {} + + +/***/ }), +/* 85 */ +/***/ (function(module, exports, __webpack_require__) { + +var Connection = __webpack_require__(8); +var PoolSelector = __webpack_require__(29); + +module.exports = PoolNamespace; + +/** + * PoolNamespace + * @constructor + * @param {PoolCluster} cluster The parent cluster for the namespace + * @param {string} pattern The selection pattern to use + * @param {string} selector The selector name to use + * @public + */ +function PoolNamespace(cluster, pattern, selector) { + this._cluster = cluster; + this._pattern = pattern; + this._selector = new PoolSelector[selector](); +} + +PoolNamespace.prototype.getConnection = function(cb) { + var clusterNode = this._getClusterNode(); + var cluster = this._cluster; + var namespace = this; + + if (clusterNode === null) { + var err = null; + + if (this._cluster._findNodeIds(this._pattern, true).length !== 0) { + err = new Error('Pool does not have online node.'); + err.code = 'POOL_NONEONLINE'; + } else { + err = new Error('Pool does not exist.'); + err.code = 'POOL_NOEXIST'; + } + + cb(err); + return; + } + + cluster._getConnection(clusterNode, function(err, connection) { + var retry = err && cluster._canRetry + && cluster._findNodeIds(namespace._pattern).length !== 0; + + if (retry) { + namespace.getConnection(cb); + return; + } + + if (err) { + cb(err); + return; + } + + cb(null, connection); + }); +}; + +PoolNamespace.prototype.query = function (sql, values, cb) { + var cluster = this._cluster; + var clusterNode = this._getClusterNode(); + var query = Connection.createQuery(sql, values, cb); + var namespace = this; + + if (clusterNode === null) { + var err = null; + + if (this._cluster._findNodeIds(this._pattern, true).length !== 0) { + err = new Error('Pool does not have online node.'); + err.code = 'POOL_NONEONLINE'; + } else { + err = new Error('Pool does not exist.'); + err.code = 'POOL_NOEXIST'; + } + + process.nextTick(function () { + query.on('error', function () {}); + query.end(err); + }); + return query; + } + + if (!(typeof sql === 'object' && 'typeCast' in sql)) { + query.typeCast = clusterNode.pool.config.connectionConfig.typeCast; + } + + if (clusterNode.pool.config.connectionConfig.trace) { + // Long stack trace support + query._callSite = new Error(); + } + + cluster._getConnection(clusterNode, function (err, conn) { + var retry = err && cluster._canRetry + && cluster._findNodeIds(namespace._pattern).length !== 0; + + if (retry) { + namespace.query(query); + return; + } + + if (err) { + query.on('error', function () {}); + query.end(err); + return; + } + + // Release connection based off event + query.once('end', function() { + conn.release(); + }); + + conn.query(query); + }); + + return query; +}; + +PoolNamespace.prototype._getClusterNode = function _getClusterNode() { + var foundNodeIds = this._cluster._findNodeIds(this._pattern); + var nodeId; + + switch (foundNodeIds.length) { + case 0: + nodeId = null; + break; + case 1: + nodeId = foundNodeIds[0]; + break; + default: + nodeId = this._selector(foundNodeIds); + break; + } + + return nodeId !== null + ? this._cluster._getNode(nodeId) + : null; +}; + + +/***/ }) +/******/ ]); \ No newline at end of file diff --git a/mysql-async/src/mysql.js b/mysql-async/src/mysql.js new file mode 100644 index 00000000..29c9d111 --- /dev/null +++ b/mysql-async/src/mysql.js @@ -0,0 +1,139 @@ +const mysql = require('mysql'); + +let config = {}; +let debug = 0; +let pool; + +function prepareQuery(query, parameters) { + let sql = query; + if (parameters !== null && typeof parameters === 'object') { + sql = query.replace(/@(\w+)/g, (txt, key) => { + if (parameters.hasOwnProperty(key)) { + return mysql.escape(parameters[key]); + } else if (parameters.hasOwnProperty(`@${key}`)) { + return mysql.escape(parameters[`@${key}`]); + } + return txt; + }); + } + return sql; +} + +function writeDebug(time, sql, error) { + if (error) console.log(`[ERROR] [MySQL] An error happens on MySQL for query "${sql}": ${error.message}`) + if (debug) console.log(`[MySQL] [${(time[0]*1e3+time[1]*1e-6).toFixed()}ms] ${sql}`); +} + +async function safeInvoke(callback, args) { + if (typeof callback === 'function') setImmediate(() => { + callback(args); + }); +} + +// transform tinyint(1) to boolean +function useBoolean(fields, results) { + if (fields) { + fields.forEach(field => { + // found a column with tinyint(1) + if (field.type === 1 && field.length === 1) { + results.forEach((_, index) => { + results[index][field.name] = (results[index][field.name] !== 0); + }); + } + }); + } + return results; +} + +global.exports('mysql_execute', (query, parameters, callback) => { + let sql = prepareQuery(query, parameters); + let start = process.hrtime(); + pool.query(sql, (error, results) => { + writeDebug(process.hrtime(start), sql, error); + safeInvoke(callback, (results) ? results.affectedRows : 0); + }); +}); + +global.exports('mysql_fetch_all', (query, parameters, callback) => { + let sql = prepareQuery(query, parameters); + let start = process.hrtime(); + pool.query(sql, (error, results, fields) => { + writeDebug(process.hrtime(start), sql, error); + results = useBoolean(fields, results); + safeInvoke(callback, results); + }); +}); + +global.exports('mysql_fetch_scalar', (query, parameters, callback) => { + let sql = prepareQuery(query, parameters); + let start = process.hrtime(); + pool.query(sql, (error, results, fields) => { + writeDebug(process.hrtime(start), sql, error); + results = useBoolean(fields, results); + safeInvoke(callback, (results) ? Object.values(results[0])[0] : null); + }); +}); + +global.exports('mysql_insert', (query, parameters, callback) => { + let sql = prepareQuery(query, parameters); + let start = process.hrtime(); + pool.query(sql, (error, results) => { + writeDebug(process.hrtime(start), sql, error); + safeInvoke(callback, (results) ? results.insertId : 0); + }); +}); + +function parseOptions(config, options) { + const cfg = config; + const opts = options.split('&'); + opts.forEach((o) => { + const keyValue = o.split('='); + cfg[keyValue[0]] = keyValue[1]; + }); + return cfg; +} + +function parseConnectingString(connectionString) { + if(/(?:database|initial\scatalog)=(?:(.*?);|(.*))/gi.test(connectionString)) { + + let matches = (/(?:host|server|data\s?source|addr(?:ess)?)=(?:(.*?);|(.*))/gi.exec(connectionString)); + const host = (matches) ? matches[1] || matches[2] : 'localhost'; + matches = (/(?:Port)=(?:(.*?);|(.*))/gi.exec(connectionString)); + const port = (matches) ? matches[1] || matches[2] : 3306; + matches = (/(?:user\s?(?:id|name)?|uid)=(?:(.*?);|(.*))/gi.exec(connectionString)); + const user = (matches) ? matches[1] || matches[2] : 'root'; + matches = (/(?:password|pwd)=(?:(.*?);|(.*))/gi.exec(connectionString)); + const password = (matches) ? matches[1] || matches[2] : ''; + matches = (/(?:database|initial\scatalog)=(?:(.*?);|(.*))/gi.exec(connectionString)); + const database = (matches) ? matches[1] || matches[2] : ''; + return { host, port, user, password, database, dateStrings: true }; + + } else if(/mysql:\/\//gi.test(connectionString)) { + + let matches = /mysql:\/\/(.*?)(?::|@)(?:(.*)@)?(.*?)(?::(\d{1,5}))?\/(.*?)\?(.*)/gi.exec(connectionString); + const host = (matches[3]) ? matches[3] : 'localhost'; + const port = (matches[4]) ? matches[4] : 3306; + const user = (matches[1]) ? matches[1] : 'root'; + const password = (matches[2]) ? matches[2] : ''; + const database = (matches[5]) ? matches[5] : ''; + const config = { host, port, user, password, database }; + const options = matches[6]; + return parseOptions(config, options); + + } else throw new Error('No valid connection string found'); +} + +let isReady = false; +global.on('onServerResourceStart', (resourcename) => { + if (resourcename == 'mysql-async') { + const connectionString = global.GetConvar('mysql_connection_string', 'mysql://localhost/'); + config = parseConnectingString(connectionString); + debug = global.GetConvarInt('mysql_debug', 0); + pool = mysql.createPool(config); + global.emit('onMySQLReady'); // avoid ESX bugs + isReady = true; + } + if (isReady) { + global.emit('MySQLReady'); // avoid ESX bugs + } +}); diff --git a/mysql-async/src/package.json b/mysql-async/src/package.json new file mode 100644 index 00000000..74cc3c87 --- /dev/null +++ b/mysql-async/src/package.json @@ -0,0 +1,22 @@ +{ + "name": "mysql-async", + "version": "3.0.1", + "description": "fivem-mysql-async", + "private": true, + "scripts": { + "build": "webpack" + }, + "contributors": [ + "Joel Wurtz", + "Matthias Mandelartz" + ], + "license": "MIT", + "dependencies": { + "mysql": "^2.16.0" + }, + "devDependencies": { + "eslint": "^5.6.0", + "webpack": "^4.19.0", + "webpack-cli": "^3.1.0" + } +} diff --git a/mysql-async/src/webpack.config.js b/mysql-async/src/webpack.config.js new file mode 100644 index 00000000..479cd28d --- /dev/null +++ b/mysql-async/src/webpack.config.js @@ -0,0 +1,14 @@ +const path = require('path'); + +module.exports = { + entry: './mysql.js', + target: 'node', + mode: 'production', + output: { + filename: 'mysql-async.js', + path: path.resolve(__dirname, '..'), + }, + optimization: { + minimize: false, + }, +}; diff --git a/readME.txt b/readME.txt new file mode 100644 index 00000000..c681c790 --- /dev/null +++ b/readME.txt @@ -0,0 +1,130 @@ +Thanks You KASH (github.com/KASHZIN)Who The Original Develop This ESX_KASHACTERS RELEASE And To XxFri3ndlyxX (github.com/XxFri3ndlyxX) + +1.Step One [ essentialmode\client\main.lua ] + +Delete Or Replace This ! +```--[[Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + + if NetworkIsSessionStarted() then + TriggerServerEvent('es:firstJoinProper') + TriggerEvent('es:allowedToSpawn') + return + end + end +end)]]--``` + +2.Step Two [ es_extended [ LINE : 457 ] client/main.lua ] +This To Fix Cant Open Inventory When You Die And Get Revived + +Change You Menu interactions to this ! +``` ---Menu interactions +Citizen.CreateThread(function() + while true do + + Citizen.Wait(0) + + if IsControlJustReleased(0, 289) and IsInputDisabled(0) and not ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then + ESX.ShowInventory() + end + + end +end)``` + +3. Step Three +To Get Your esx_kashacters work you need do this on your database + +```SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner'``` +And This +```SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'indentifier'``` +Credit @Xnubil + +6. Step Six [Fix Datastore] +Duplicate Your esx_datastore or add This line on your esx_datastore server\main.lua + +```-- Fix was taken from this link -- +-- https://forum.fivem.net/t/release-esx-kashacters-multi-character/251613/448?u=xxfri3ndlyxx -- +AddEventHandler('esx:playerLoaded', function(source) + + local result = MySQL.Sync.fetchAll('SELECT * FROM datastore') + + for i=1, #result, 1 do + local name = result[i].name + local label = result[i].label + local shared = result[i].shared + + local result2 = MySQL.Sync.fetchAll('SELECT * FROM datastore_data WHERE name = @name', { + ['@name'] = name + }) + + if shared == 0 then + + table.insert(DataStoresIndex, name) + DataStores[name] = {} + + for j=1, #result2, 1 do + local storeName = result2[j].name + local storeOwner = result2[j].owner + local storeData = (result2[j].data == nil and {} or json.decode(result2[j].data)) + local dataStore = CreateDataStore(storeName, storeOwner, storeData) + + table.insert(DataStores[name], dataStore) + end + end + end + + local _source = source + local xPlayer = ESX.GetPlayerFromId(_source) + local dataStores = {} + + for i=1, #DataStoresIndex, 1 do + local name = DataStoresIndex[i] + local dataStore = GetDataStore(name, xPlayer.identifier) + + if dataStore == nil then + MySQL.Async.execute('INSERT INTO datastore_data (name, owner, data) VALUES (@name, @owner, @data)', + { + ['@name'] = name, + ['@owner'] = xPlayer.identifier, + ['@data'] = '{}' + }) + + dataStore = CreateDataStore(name, xPlayer.identifier, {}) + table.insert(DataStores[name], dataStore) + end + + table.insert(dataStores, dataStore) + end + + xPlayer.set('dataStores', dataStores) +end)``` + +Download Link : https://github.com/XxFri3ndlyxX/esx_datastore +Credits : https://github.com/XxFri3ndlyxX + +5. Step Five [ Fix Ambulance ] +This To Fix Die Tele And When Your Get Revived You Cant Open any Menu only F2 + +Download My File the esx_ambulancejob (or download the lastest version esx_ambulancejob :v) + +6. Step Six [ Fix your esx_kashacters identifier ] +Download My mysql-async And start on your server.cfg + +7. Step Seven [ Fix Your Identifier And Spawn] +Download My esx_kashacters Modified And start on your server.cfg +Thats All Identifier [esx_kashacters\server\main.lua] maybe thats all +you need in Roleplay Server if you wan to change just change it + +===--------------------------------------------------------------------=== + +Okey Thats All Make My esx_kashacters work properly if you wanna ask +My Discord : Blue.#5108 + +Thank you Again to KASH And XxFri3ndlyxX ! :) +ENJOY YOUR ESX_KASHACTERS + + + + + From 449302db62cf7db4a3c89ca466f8238fe3619a47 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Wed, 17 Jul 2019 15:26:58 +0700 Subject: [PATCH 002/205] Update readME.txt --- readME.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readME.txt b/readME.txt index c681c790..d55f3f83 100644 --- a/readME.txt +++ b/readME.txt @@ -1,5 +1,7 @@ Thanks You KASH (github.com/KASHZIN)Who The Original Develop This ESX_KASHACTERS RELEASE And To XxFri3ndlyxX (github.com/XxFri3ndlyxX) +this tutorial i made original a little bit use XxFri3ndlyxX tutorial :v + 1.Step One [ essentialmode\client\main.lua ] Delete Or Replace This ! From 7faae48fb89767e17d9168177f5888c6ed06f947 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Mon, 22 Jul 2019 00:17:09 +0700 Subject: [PATCH 003/205] Update readME.txt --- readME.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readME.txt b/readME.txt index d55f3f83..9fbac6bb 100644 --- a/readME.txt +++ b/readME.txt @@ -35,7 +35,7 @@ Citizen.CreateThread(function() end)``` 3. Step Three -To Get Your esx_kashacters work you need do this on your database +To Get Your esx_kashacters work you need do this on your query db ```SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner'``` And This From 440256a631c64957b6a282a8877df1c0fbe2a6f3 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 13 Aug 2019 22:00:13 +0700 Subject: [PATCH 004/205] Update readME.txt --- readME.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/readME.txt b/readME.txt index 9fbac6bb..08238a5a 100644 --- a/readME.txt +++ b/readME.txt @@ -5,7 +5,7 @@ this tutorial i made original a little bit use XxFri3ndlyxX tutorial :v 1.Step One [ essentialmode\client\main.lua ] Delete Or Replace This ! -```--[[Citizen.CreateThread(function() +--[[Citizen.CreateThread(function() while true do Citizen.Wait(0) @@ -15,13 +15,13 @@ Delete Or Replace This ! return end end -end)]]--``` +end)]]-- 2.Step Two [ es_extended [ LINE : 457 ] client/main.lua ] This To Fix Cant Open Inventory When You Die And Get Revived Change You Menu interactions to this ! -``` ---Menu interactions + ---Menu interactions Citizen.CreateThread(function() while true do @@ -32,20 +32,20 @@ Citizen.CreateThread(function() end end -end)``` +end) 3. Step Three To Get Your esx_kashacters work you need do this on your query db -```SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner'``` +SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner' And This -```SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'indentifier'``` +SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'indentifier' Credit @Xnubil 6. Step Six [Fix Datastore] Duplicate Your esx_datastore or add This line on your esx_datastore server\main.lua -```-- Fix was taken from this link -- +-- Fix was taken from this link -- -- https://forum.fivem.net/t/release-esx-kashacters-multi-character/251613/448?u=xxfri3ndlyxx -- AddEventHandler('esx:playerLoaded', function(source) @@ -100,7 +100,7 @@ AddEventHandler('esx:playerLoaded', function(source) end xPlayer.set('dataStores', dataStores) -end)``` +end) Download Link : https://github.com/XxFri3ndlyxX/esx_datastore Credits : https://github.com/XxFri3ndlyxX From 1fe1f523767f83189499430704f6e98ce5cdf0c0 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 13 Aug 2019 22:05:51 +0700 Subject: [PATCH 005/205] updated mysql-async Updated mysql-async --- mysql-async/.editorconfig | 13 + mysql-async/.gitignore | 4 + mysql-async/LICENSE | 2 +- mysql-async/README.md | 55 +- mysql-async/__resource.lua | 21 + mysql-async/mysql-async-client.js | 219 ++++ mysql-async/mysql-async.js | 1843 ++++++++++++++--------------- 7 files changed, 1212 insertions(+), 945 deletions(-) create mode 100644 mysql-async/.editorconfig create mode 100644 mysql-async/.gitignore create mode 100644 mysql-async/mysql-async-client.js diff --git a/mysql-async/.editorconfig b/mysql-async/.editorconfig new file mode 100644 index 00000000..3fa23bc3 --- /dev/null +++ b/mysql-async/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[**.js] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +max_line_length = null + +[**.md] +trim_trailing_whitespace = false diff --git a/mysql-async/.gitignore b/mysql-async/.gitignore new file mode 100644 index 00000000..33f41cdb --- /dev/null +++ b/mysql-async/.gitignore @@ -0,0 +1,4 @@ +src/node_modules +src/package-lock.json + +.idea diff --git a/mysql-async/LICENSE b/mysql-async/LICENSE index 64b7d3ac..8971eee6 100644 --- a/mysql-async/LICENSE +++ b/mysql-async/LICENSE @@ -1,4 +1,4 @@ -Copyright © 2017, Joel Wurtz; © 2018 Matthias Mandelartz +Copyright © 2017, Joel Wurtz; © 2018 - 2019 Matthias Mandelartz Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the diff --git a/mysql-async/README.md b/mysql-async/README.md index cc2d6ae7..4bfab6e2 100644 --- a/mysql-async/README.md +++ b/mysql-async/README.md @@ -1,13 +1,16 @@ -# MySQL Async Library for FiveM +# mysql-async Library for FiveM -This library intends to provide function to connect to a MySQL library in a Sync and Async Way. +This library intends to provide function to connect to a MySQL library in a Sync and Async way. -## Disclaimer +## Table of Contents +* [Installation](#installation) +* [Configuration](#configuration) + * [keepAlive](#keepalive) + * [ConVars](#convars) +* [GUI](#gui) +* [Usage](#usage) +* [Features](#features) -This mod does not replace EssentialMode, it offers instead a way of connecting to MySQL from lua-scripts, but -it will never contain any gameplay logic. It will remain a simple wrapper around MySQL functions. - -All feedback is appreciated in order to deliver a stable release. ## Installation @@ -20,19 +23,32 @@ Once installed, you will need to add this line of code in the resource file of e server_script '@mysql-async/lib/MySQL.lua' ``` -### Warning - -On Linux servers, users need to stick with the old mysql-async 2.x at least for the moment, due to some issues the linux server has with v8/javascript. - -It can be downloaded from https://github.com/brouznouf/fivem-mysql-async/tree/2.0 or the release section. Note that the connection_string is different for 3.0.0 and 2.x. - ## Configuration Add this convar to your server configuration and change the values according to your MySQL installation: -`set mysql_connection_string "mysql://username:password@host/database?dateStrings=true"` +`set mysql_connection_string "server=localhost;uid=mysqluser;password=password;database=fivem"` -Further options can be found under https://github.com/mysqljs/mysql#connection-options +Alternatively an url-like connection string can be used: + +`set mysql_connection_string "mysql://username:password@host/database"` + +Further options can be found under https://github.com/mysqljs/mysql#connection-options for the mysql.js connection string, they can be added on both: the semicolon seperated string or the url-like string. + +### keepAlive + +For people, having issues with the connection being interrupted for usually a bad network configuration, but have no way of figuring out what is wrong, there is an option to enable keep alive queries. This will execute a query on the given interval. To enable those keep alive queries, append e.g. `keepAlive=60` to your connection string, seperated with a semicolon, to ensure that a keep alive query is fired every 60s. + +### ConVars + +The following ConVars are available in the `server.cfg` which you execute. These have also to be set before `start mysql-async` +* `set mysql_debug 1`: Prints out the actual consumed query. +* `set mysql_debug_output "console"`: Select where to output the log, accepts `console`, `file`, and `both`. In case of `both` and `file` a file named `mysql-async.log` in your main server folder will be created. +* `set mysql_slow_query_warning 200`: Sets a limit in ms, queries slower than this limit will be displayed with a warning at the specified location of `mysql_debug_output`, see above. + +## GUI + +Since the newest version, anyone with ace admin rights can open the GUI by typing `mysql` in the F8 console. This opens a profiling view of the data collected by this middleware, that might help you optimize resources and queries. You can disable the viewing of certain data by clicking on the respective entry in the legends, and can browse a table of the 21 slowest performing queries. ## Usage @@ -115,12 +131,7 @@ local countPlayer = MySQL.Sync.fetchScalar("SELECT COUNT(1) FROM players") ## Features - * Async / Sync + * Async / Sync. * It uses the https://github.com/mysqljs/mysql library to provide a connection to your mysql server. * Create and close a connection for each query, the underlying library use a connection pool so only the -mysql auth is done each time, old tcp connections are keeped in memory for performance reasons - -## Credits - -Some parts of this library, and also my understanding were directly inspired by "Essential Mode", thanks to -them to have begin to work on this, which allows guy like me to not start from scratch every time... +mysql auth is done each time, old tcp connections are keeped in memory for performance reasons. diff --git a/mysql-async/__resource.lua b/mysql-async/__resource.lua index df3f8118..ad95aa37 100644 --- a/mysql-async/__resource.lua +++ b/mysql-async/__resource.lua @@ -1,3 +1,24 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' +version '3.2.0' + server_script 'mysql-async.js' +client_script 'mysql-async-client.js' + +files { + 'ui/index.html', + 'ui/app.js', + 'ui/app.css', + 'ui/fonts/fira-sans-v9-latin-700.woff', + 'ui/fonts/fira-sans-v9-latin-700.woff2', + 'ui/fonts/fira-sans-v9-latin-italic.woff', + 'ui/fonts/fira-sans-v9-latin-italic.woff2', + 'ui/fonts/fira-sans-v9-latin-regular.woff', + 'ui/fonts/fira-sans-v9-latin-regular.woff2', + 'ui/fonts/MaterialIcons-Regular.eot', + 'ui/fonts/MaterialIcons-Regular.ttf', + 'ui/fonts/MaterialIcons-Regular.woff', + 'ui/fonts/MaterialIcons-Regular.woff2', +} + +ui_page 'ui/index.html' diff --git a/mysql-async/mysql-async-client.js b/mysql-async/mysql-async-client.js new file mode 100644 index 00000000..db0e98bd --- /dev/null +++ b/mysql-async/mysql-async-client.js @@ -0,0 +1,219 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports) { + +let isNuiActive = false; + +function NuiMessage(msg) { + window.SendNuiMessage(JSON.stringify(msg)); +} + +function NuiCallback(name, callback) { + window.RegisterNuiCallbackType(name); + window.on(`__cfx_nui:${name}`, (data, cb) => { + callback(data); + cb('ok'); + }); +} + +function setNuiActive(boolean = true) { + if (boolean !== isNuiActive) { + if (boolean) { + window.emitNet('mysql-async:request-data'); + } + isNuiActive = boolean; + NuiMessage({ type: 'onToggleShow' }); + window.SetNuiFocus(boolean, boolean); + } +} + +window.RegisterCommand('mysql', () => { + setNuiActive(); +}, true); + +NuiCallback('close-explorer', () => { + setNuiActive(false); +}); + +window.setInterval(() => { + if (isNuiActive) { + window.emitNet('mysql-async:request-data'); + } +}, 300000); + +window.onNet('mysql-async:update-resource-data', (resourceData) => { + let arrayToSortAndMap = []; + const resources = Object.keys(resourceData); + for (let i = 0; i < resources.length; i += 1) { + if (Object.prototype.hasOwnProperty.call(resourceData, resources[i])) { + if (Object.prototype.hasOwnProperty.call(resourceData[resources[i]], 'totalExecutionTime')) { + arrayToSortAndMap.push({ + resource: resources[i], + queryTime: resourceData[resources[i]].totalExecutionTime, + count: resourceData[resources[i]].queryCount, + }); + } + } + } + if (arrayToSortAndMap.length > 0) { + arrayToSortAndMap.sort((a, b) => a.queryTime - b.queryTime); + const len = arrayToSortAndMap.length; + arrayToSortAndMap = arrayToSortAndMap.filter((_, index) => index > len - 31); + arrayToSortAndMap.sort((a, b) => { + const resourceA = a.resource.toLowerCase(); + const resourceB = b.resource.toLowerCase(); + let result = 0; + if (resourceA < resourceB) { + result = -1; + } else if (resourceA > resourceB) { + result = 1; + } + return result; + }); + NuiMessage({ + type: 'onResourceLabels', + resourceLabels: arrayToSortAndMap.map(el => el.resource), + }); + NuiMessage({ + type: 'onResourceData', + resourceData: [ + { + data: arrayToSortAndMap.map(el => el.queryTime), + }, + { + data: arrayToSortAndMap.map(el => ((el.count > 0) ? el.queryTime / el.count : 0)), + }, + { + data: arrayToSortAndMap.map(el => el.count), + }, + ], + }); + } +}); + +window.onNet('mysql-async:update-time-data', (timeData) => { + let timeArray = []; + if (Array.isArray(timeData)) { + const len = timeData.length; + timeArray = timeData.filter((_, index) => index > len - 31); + } + if (timeArray.length > 0) { + NuiMessage({ + type: 'onTimeData', + timeData: [ + { + data: timeArray.map(el => el.totalExecutionTime), + }, + { + data: timeArray.map(el => ((el.queryCount > 0) ? el.totalExecutionTime / el.queryCount + : 0)), + }, + { + data: timeArray.map(el => el.queryCount), + }, + ], + }); + } +}); + +window.onNet('mysql-async:update-slow-queries', (slowQueryData) => { + const slowQueries = slowQueryData.map((el) => { + const element = el; + element.queryTime = Math.round(el.queryTime * 100) / 100; + return element; + }); + NuiMessage({ + type: 'onSlowQueryData', + slowQueries, + }); +}); + + +/***/ }) +/******/ ]); \ No newline at end of file diff --git a/mysql-async/mysql-async.js b/mysql-async/mysql-async.js index c55ebec6..2a6c37cd 100644 --- a/mysql-async/mysql-async.js +++ b/mysql-async/mysql-async.js @@ -81,7 +81,7 @@ /******/ /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 30); +/******/ return __webpack_require__(__webpack_require__.s = 31); /******/ }) /************************************************************************/ /******/ ([ @@ -95,7 +95,7 @@ module.exports = require("util"); /***/ (function(module, exports, __webpack_require__) { /* eslint-disable node/no-deprecated-api */ -var buffer = __webpack_require__(39) +var buffer = __webpack_require__(41) var Buffer = buffer.Buffer // alternative to using Object.keys for old browsers @@ -162,28 +162,28 @@ SafeBuffer.allocUnsafeSlow = function (size) { /* 2 */ /***/ (function(module, exports, __webpack_require__) { -exports.AuthSwitchRequestPacket = __webpack_require__(43); -exports.AuthSwitchResponsePacket = __webpack_require__(44); -exports.ClientAuthenticationPacket = __webpack_require__(45); -exports.ComChangeUserPacket = __webpack_require__(46); -exports.ComPingPacket = __webpack_require__(47); -exports.ComQueryPacket = __webpack_require__(48); -exports.ComQuitPacket = __webpack_require__(49); -exports.ComStatisticsPacket = __webpack_require__(50); -exports.EmptyPacket = __webpack_require__(51); -exports.EofPacket = __webpack_require__(52); -exports.ErrorPacket = __webpack_require__(53); +exports.AuthSwitchRequestPacket = __webpack_require__(45); +exports.AuthSwitchResponsePacket = __webpack_require__(46); +exports.ClientAuthenticationPacket = __webpack_require__(47); +exports.ComChangeUserPacket = __webpack_require__(48); +exports.ComPingPacket = __webpack_require__(49); +exports.ComQueryPacket = __webpack_require__(50); +exports.ComQuitPacket = __webpack_require__(51); +exports.ComStatisticsPacket = __webpack_require__(52); +exports.EmptyPacket = __webpack_require__(53); +exports.EofPacket = __webpack_require__(54); +exports.ErrorPacket = __webpack_require__(55); exports.Field = __webpack_require__(17); -exports.FieldPacket = __webpack_require__(54); -exports.HandshakeInitializationPacket = __webpack_require__(55); -exports.LocalDataFilePacket = __webpack_require__(56); -exports.OkPacket = __webpack_require__(57); -exports.OldPasswordPacket = __webpack_require__(58); -exports.ResultSetHeaderPacket = __webpack_require__(59); -exports.RowDataPacket = __webpack_require__(60); -exports.SSLRequestPacket = __webpack_require__(61); -exports.StatisticsPacket = __webpack_require__(62); -exports.UseOldPasswordPacket = __webpack_require__(63); +exports.FieldPacket = __webpack_require__(56); +exports.HandshakeInitializationPacket = __webpack_require__(57); +exports.LocalDataFilePacket = __webpack_require__(58); +exports.OkPacket = __webpack_require__(59); +exports.OldPasswordPacket = __webpack_require__(60); +exports.ResultSetHeaderPacket = __webpack_require__(61); +exports.RowDataPacket = __webpack_require__(62); +exports.SSLRequestPacket = __webpack_require__(63); +exports.StatisticsPacket = __webpack_require__(64); +exports.UseOldPasswordPacket = __webpack_require__(65); /***/ }), @@ -193,8 +193,7 @@ exports.UseOldPasswordPacket = __webpack_require__(63); var Util = __webpack_require__(0); var EventEmitter = __webpack_require__(4).EventEmitter; var Packets = __webpack_require__(2); -var ErrorConstants = __webpack_require__(64); -var Timer = __webpack_require__(65); +var ErrorConstants = __webpack_require__(66); // istanbul ignore next: Node.js < 0.10 not covered var listenerCount = EventEmitter.listenerCount @@ -218,7 +217,13 @@ function Sequence(options, callback) { this._callSite = null; this._ended = false; this._timeout = options.timeout; - this._timer = new Timer(this); + + // For Timers + this._idleNext = null; + this._idlePrev = null; + this._idleStart = null; + this._idleTimeout = -1; + this._repeat = null; } Sequence.determinePacket = function(byte) { @@ -358,7 +363,7 @@ module.exports = require("events"); /**/ -var pna = __webpack_require__(10); +var processNextTick = __webpack_require__(11); /**/ /**/ @@ -377,18 +382,15 @@ var util = __webpack_require__(6); util.inherits = __webpack_require__(7); /**/ -var Readable = __webpack_require__(20); -var Writable = __webpack_require__(23); +var Readable = __webpack_require__(21); +var Writable = __webpack_require__(24); util.inherits(Duplex, Readable); -{ - // avoid scope creep, the keys array can then be collected - var keys = objectKeys(Writable.prototype); - for (var v = 0; v < keys.length; v++) { - var method = keys[v]; - if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; - } +var keys = objectKeys(Writable.prototype); +for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; } function Duplex(options) { @@ -407,16 +409,6 @@ function Duplex(options) { this.once('end', onend); } -Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._writableState.highWaterMark; - } -}); - // the no-half-open enforcer function onend() { // if we allow half-open state, or if the writable side ended, @@ -425,7 +417,7 @@ function onend() { // no more data can be written. // But allow more writes to happen in this tick. - pna.nextTick(onEndNT, this); + processNextTick(onEndNT, this); } function onEndNT(self) { @@ -457,9 +449,15 @@ Duplex.prototype._destroy = function (err, cb) { this.push(null); this.end(); - pna.nextTick(cb, err); + processNextTick(cb, err); }; +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + /***/ }), /* 6 */ /***/ (function(module, exports) { @@ -582,7 +580,7 @@ try { if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { - module.exports = __webpack_require__(74); + module.exports = __webpack_require__(73); } @@ -592,11 +590,11 @@ try { var Crypto = __webpack_require__(15); var Events = __webpack_require__(4); -var Net = __webpack_require__(31); -var tls = __webpack_require__(32); -var ConnectionConfig = __webpack_require__(11); -var Protocol = __webpack_require__(35); -var SqlString = __webpack_require__(26); +var Net = __webpack_require__(33); +var tls = __webpack_require__(34); +var ConnectionConfig = __webpack_require__(9); +var Protocol = __webpack_require__(37); +var SqlString = __webpack_require__(27); var Query = __webpack_require__(19); var Util = __webpack_require__(0); @@ -614,16 +612,28 @@ function Connection(options) { this.threadId = null; } +function bindToCurrentDomain(callback) { + if (!callback) { + return undefined; + } + + var domain = process.domain; + + return domain + ? domain.bind(callback) + : callback; +} + Connection.createQuery = function createQuery(sql, values, callback) { if (sql instanceof Query) { return sql; } - var cb = wrapCallbackInDomain(null, callback); + var cb = bindToCurrentDomain(callback); var options = {}; if (typeof sql === 'function') { - cb = wrapCallbackInDomain(null, sql); + cb = bindToCurrentDomain(sql); return new Query(options, cb); } @@ -633,7 +643,7 @@ Connection.createQuery = function createQuery(sql, values, callback) { } if (typeof values === 'function') { - cb = wrapCallbackInDomain(null, values); + cb = bindToCurrentDomain(values); } else if (values !== undefined) { options.values = values; } @@ -645,7 +655,7 @@ Connection.createQuery = function createQuery(sql, values, callback) { options.values = values; if (typeof values === 'function') { - cb = wrapCallbackInDomain(null, values); + cb = bindToCurrentDomain(values); options.values = undefined; } @@ -679,15 +689,15 @@ Connection.prototype.connect = function connect(options, callback) { this._protocol.on('data', function(data) { connection._socket.write(data); }); - this._socket.on('data', wrapToDomain(connection, function (data) { + this._socket.on('data', function(data) { connection._protocol.write(data); - })); + }); this._protocol.on('end', function() { connection._socket.end(); }); - this._socket.on('end', wrapToDomain(connection, function () { + this._socket.on('end', function() { connection._protocol.end(); - })); + }); this._socket.on('error', this._handleNetworkError.bind(this)); this._socket.on('connect', this._handleProtocolConnect.bind(this)); @@ -707,7 +717,7 @@ Connection.prototype.connect = function connect(options, callback) { } } - this._protocol.handshake(options, wrapCallbackInDomain(this, callback)); + this._protocol.handshake(options, bindToCurrentDomain(callback)); }; Connection.prototype.changeUser = function changeUser(options, callback) { @@ -729,7 +739,7 @@ Connection.prototype.changeUser = function changeUser(options, callback) { timeout : options.timeout, charsetNumber : charsetNumber, currentConfig : this.config - }, wrapCallbackInDomain(this, callback)); + }, bindToCurrentDomain(callback)); }; Connection.prototype.beginTransaction = function beginTransaction(options, callback) { @@ -783,10 +793,6 @@ Connection.prototype.query = function query(sql, values, cb) { query.sql = this.format(query.sql, query.values); } - if (query._callback) { - query._callback = wrapCallbackInDomain(this, query._callback); - } - this._implyConnect(); return this._protocol._enqueue(query); @@ -799,7 +805,7 @@ Connection.prototype.ping = function ping(options, callback) { } this._implyConnect(); - this._protocol.ping(options, wrapCallbackInDomain(this, callback)); + this._protocol.ping(options, bindToCurrentDomain(callback)); }; Connection.prototype.statistics = function statistics(options, callback) { @@ -809,7 +815,7 @@ Connection.prototype.statistics = function statistics(options, callback) { } this._implyConnect(); - this._protocol.stats(options, wrapCallbackInDomain(this, callback)); + this._protocol.stats(options, bindToCurrentDomain(callback)); }; Connection.prototype.end = function end(options, callback) { @@ -830,7 +836,7 @@ Connection.prototype.end = function end(options, callback) { } this._implyConnect(); - this._protocol.quit(opts, wrapCallbackInDomain(this, cb)); + this._protocol.quit(opts, bindToCurrentDomain(cb)); }; Connection.prototype.destroy = function() { @@ -1046,146 +1052,13 @@ Connection.prototype._implyConnect = function() { } }; -function unwrapFromDomain(fn) { - return function () { - var domains = []; - var ret; - - while (process.domain) { - domains.shift(process.domain); - process.domain.exit(); - } - - try { - ret = fn.apply(this, arguments); - } finally { - for (var i = 0; i < domains.length; i++) { - domains[i].enter(); - } - } - - return ret; - }; -} - -function wrapCallbackInDomain(ee, fn) { - if (typeof fn !== 'function' || fn.domain) { - return fn; - } - - var domain = process.domain; - - if (domain) { - return domain.bind(fn); - } else if (ee) { - return unwrapFromDomain(wrapToDomain(ee, fn)); - } else { - return fn; - } -} - -function wrapToDomain(ee, fn) { - return function () { - if (Events.usingDomains && ee.domain) { - ee.domain.enter(); - fn.apply(this, arguments); - ee.domain.exit(); - } else { - fn.apply(this, arguments); - } - }; -} - /***/ }), /* 9 */ -/***/ (function(module, exports) { - -// Manually extracted from mysql-5.5.23/include/mysql_com.h -exports.CLIENT_LONG_PASSWORD = 1; /* new more secure passwords */ -exports.CLIENT_FOUND_ROWS = 2; /* Found instead of affected rows */ -exports.CLIENT_LONG_FLAG = 4; /* Get all column flags */ -exports.CLIENT_CONNECT_WITH_DB = 8; /* One can specify db on connect */ -exports.CLIENT_NO_SCHEMA = 16; /* Don't allow database.table.column */ -exports.CLIENT_COMPRESS = 32; /* Can use compression protocol */ -exports.CLIENT_ODBC = 64; /* Odbc client */ -exports.CLIENT_LOCAL_FILES = 128; /* Can use LOAD DATA LOCAL */ -exports.CLIENT_IGNORE_SPACE = 256; /* Ignore spaces before '(' */ -exports.CLIENT_PROTOCOL_41 = 512; /* New 4.1 protocol */ -exports.CLIENT_INTERACTIVE = 1024; /* This is an interactive client */ -exports.CLIENT_SSL = 2048; /* Switch to SSL after handshake */ -exports.CLIENT_IGNORE_SIGPIPE = 4096; /* IGNORE sigpipes */ -exports.CLIENT_TRANSACTIONS = 8192; /* Client knows about transactions */ -exports.CLIENT_RESERVED = 16384; /* Old flag for 4.1 protocol */ -exports.CLIENT_SECURE_CONNECTION = 32768; /* New 4.1 authentication */ - -exports.CLIENT_MULTI_STATEMENTS = 65536; /* Enable/disable multi-stmt support */ -exports.CLIENT_MULTI_RESULTS = 131072; /* Enable/disable multi-results */ -exports.CLIENT_PS_MULTI_RESULTS = 262144; /* Multi-results in PS-protocol */ - -exports.CLIENT_PLUGIN_AUTH = 524288; /* Client supports plugin authentication */ - -exports.CLIENT_SSL_VERIFY_SERVER_CERT = 1073741824; -exports.CLIENT_REMEMBER_OPTIONS = 2147483648; - - -/***/ }), -/* 10 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -if (!process.version || - process.version.indexOf('v0.') === 0 || - process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { - module.exports = { nextTick: nextTick }; -} else { - module.exports = process -} - -function nextTick(fn, arg1, arg2, arg3) { - if (typeof fn !== 'function') { - throw new TypeError('"callback" argument must be a function'); - } - var len = arguments.length; - var args, i; - switch (len) { - case 0: - case 1: - return process.nextTick(fn); - case 2: - return process.nextTick(function afterTickOne() { - fn.call(null, arg1); - }); - case 3: - return process.nextTick(function afterTickTwo() { - fn.call(null, arg1, arg2); - }); - case 4: - return process.nextTick(function afterTickThree() { - fn.call(null, arg1, arg2, arg3); - }); - default: - args = new Array(len - 1); - i = 0; - while (i < args.length) { - args[i++] = arguments[i]; - } - return process.nextTick(function afterTick() { - fn.apply(null, args); - }); - } -} - - - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -var urlParse = __webpack_require__(33).parse; -var ClientConstants = __webpack_require__(9); +var urlParse = __webpack_require__(35).parse; +var ClientConstants = __webpack_require__(10); var Charsets = __webpack_require__(16); var SSLProfiles = null; @@ -1310,7 +1183,7 @@ ConnectionConfig.getDefaultFlags = function getDefaultFlags(options) { ConnectionConfig.getSSLProfile = function getSSLProfile(name) { if (!SSLProfiles) { - SSLProfiles = __webpack_require__(34); + SSLProfiles = __webpack_require__(36); } var ssl = SSLProfiles[name]; @@ -1387,53 +1260,90 @@ ConnectionConfig.parseUrl = function(url) { }; +/***/ }), +/* 10 */ +/***/ (function(module, exports) { + +// Manually extracted from mysql-5.5.23/include/mysql_com.h +exports.CLIENT_LONG_PASSWORD = 1; /* new more secure passwords */ +exports.CLIENT_FOUND_ROWS = 2; /* Found instead of affected rows */ +exports.CLIENT_LONG_FLAG = 4; /* Get all column flags */ +exports.CLIENT_CONNECT_WITH_DB = 8; /* One can specify db on connect */ +exports.CLIENT_NO_SCHEMA = 16; /* Don't allow database.table.column */ +exports.CLIENT_COMPRESS = 32; /* Can use compression protocol */ +exports.CLIENT_ODBC = 64; /* Odbc client */ +exports.CLIENT_LOCAL_FILES = 128; /* Can use LOAD DATA LOCAL */ +exports.CLIENT_IGNORE_SPACE = 256; /* Ignore spaces before '(' */ +exports.CLIENT_PROTOCOL_41 = 512; /* New 4.1 protocol */ +exports.CLIENT_INTERACTIVE = 1024; /* This is an interactive client */ +exports.CLIENT_SSL = 2048; /* Switch to SSL after handshake */ +exports.CLIENT_IGNORE_SIGPIPE = 4096; /* IGNORE sigpipes */ +exports.CLIENT_TRANSACTIONS = 8192; /* Client knows about transactions */ +exports.CLIENT_RESERVED = 16384; /* Old flag for 4.1 protocol */ +exports.CLIENT_SECURE_CONNECTION = 32768; /* New 4.1 authentication */ + +exports.CLIENT_MULTI_STATEMENTS = 65536; /* Enable/disable multi-stmt support */ +exports.CLIENT_MULTI_RESULTS = 131072; /* Enable/disable multi-results */ +exports.CLIENT_PS_MULTI_RESULTS = 262144; /* Multi-results in PS-protocol */ + +exports.CLIENT_PLUGIN_AUTH = 524288; /* Client supports plugin authentication */ + +exports.CLIENT_SSL_VERIFY_SERVER_CERT = 1073741824; +exports.CLIENT_REMEMBER_OPTIONS = 2147483648; + + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = nextTick; +} else { + module.exports = process.nextTick; +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} + + /***/ }), /* 12 */ -/***/ (function(module, exports) { - -// Manually extracted from mysql-5.7.9/include/mysql.h.pp -// some more info here: http://dev.mysql.com/doc/refman/5.5/en/c-api-prepared-statement-type-codes.html -exports.DECIMAL = 0x00; // aka DECIMAL (http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html) -exports.TINY = 0x01; // aka TINYINT, 1 byte -exports.SHORT = 0x02; // aka SMALLINT, 2 bytes -exports.LONG = 0x03; // aka INT, 4 bytes -exports.FLOAT = 0x04; // aka FLOAT, 4-8 bytes -exports.DOUBLE = 0x05; // aka DOUBLE, 8 bytes -exports.NULL = 0x06; // NULL (used for prepared statements, I think) -exports.TIMESTAMP = 0x07; // aka TIMESTAMP -exports.LONGLONG = 0x08; // aka BIGINT, 8 bytes -exports.INT24 = 0x09; // aka MEDIUMINT, 3 bytes -exports.DATE = 0x0a; // aka DATE -exports.TIME = 0x0b; // aka TIME -exports.DATETIME = 0x0c; // aka DATETIME -exports.YEAR = 0x0d; // aka YEAR, 1 byte (don't ask) -exports.NEWDATE = 0x0e; // aka ? -exports.VARCHAR = 0x0f; // aka VARCHAR (?) -exports.BIT = 0x10; // aka BIT, 1-8 byte -exports.TIMESTAMP2 = 0x11; // aka TIMESTAMP with fractional seconds -exports.DATETIME2 = 0x12; // aka DATETIME with fractional seconds -exports.TIME2 = 0x13; // aka TIME with fractional seconds -exports.JSON = 0xf5; // aka JSON -exports.NEWDECIMAL = 0xf6; // aka DECIMAL -exports.ENUM = 0xf7; // aka ENUM -exports.SET = 0xf8; // aka SET -exports.TINY_BLOB = 0xf9; // aka TINYBLOB, TINYTEXT -exports.MEDIUM_BLOB = 0xfa; // aka MEDIUMBLOB, MEDIUMTEXT -exports.LONG_BLOB = 0xfb; // aka LONGBLOG, LONGTEXT -exports.BLOB = 0xfc; // aka BLOB, TEXT -exports.VAR_STRING = 0xfd; // aka VARCHAR, VARBINARY -exports.STRING = 0xfe; // aka CHAR, BINARY -exports.GEOMETRY = 0xff; // aka GEOMETRY - - -/***/ }), -/* 13 */ -/***/ (function(module, exports) { - -module.exports = require("stream"); - -/***/ }), -/* 14 */ /***/ (function(module, exports, __webpack_require__) { var Classes = Object.create(null); @@ -1571,22 +1481,22 @@ function loadClass(className) { Class = __webpack_require__(8); break; case 'ConnectionConfig': - Class = __webpack_require__(11); + Class = __webpack_require__(9); break; case 'Pool': - Class = __webpack_require__(27); + Class = __webpack_require__(28); break; case 'PoolCluster': Class = __webpack_require__(84); break; case 'PoolConfig': - Class = __webpack_require__(28); + Class = __webpack_require__(29); break; case 'SqlString': - Class = __webpack_require__(26); + Class = __webpack_require__(27); break; case 'Types': - Class = __webpack_require__(12); + Class = __webpack_require__(13); break; default: throw new Error('Cannot find class \'' + className + '\''); @@ -1599,6 +1509,51 @@ function loadClass(className) { } +/***/ }), +/* 13 */ +/***/ (function(module, exports) { + +// Manually extracted from mysql-5.7.9/include/mysql.h.pp +// some more info here: http://dev.mysql.com/doc/refman/5.5/en/c-api-prepared-statement-type-codes.html +exports.DECIMAL = 0x00; // aka DECIMAL (http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html) +exports.TINY = 0x01; // aka TINYINT, 1 byte +exports.SHORT = 0x02; // aka SMALLINT, 2 bytes +exports.LONG = 0x03; // aka INT, 4 bytes +exports.FLOAT = 0x04; // aka FLOAT, 4-8 bytes +exports.DOUBLE = 0x05; // aka DOUBLE, 8 bytes +exports.NULL = 0x06; // NULL (used for prepared statements, I think) +exports.TIMESTAMP = 0x07; // aka TIMESTAMP +exports.LONGLONG = 0x08; // aka BIGINT, 8 bytes +exports.INT24 = 0x09; // aka MEDIUMINT, 3 bytes +exports.DATE = 0x0a; // aka DATE +exports.TIME = 0x0b; // aka TIME +exports.DATETIME = 0x0c; // aka DATETIME +exports.YEAR = 0x0d; // aka YEAR, 1 byte (don't ask) +exports.NEWDATE = 0x0e; // aka ? +exports.VARCHAR = 0x0f; // aka VARCHAR (?) +exports.BIT = 0x10; // aka BIT, 1-8 byte +exports.TIMESTAMP2 = 0x11; // aka TIMESTAMP with fractional seconds +exports.DATETIME2 = 0x12; // aka DATETIME with fractional seconds +exports.TIME2 = 0x13; // aka TIME with fractional seconds +exports.JSON = 0xf5; // aka JSON +exports.NEWDECIMAL = 0xf6; // aka DECIMAL +exports.ENUM = 0xf7; // aka ENUM +exports.SET = 0xf8; // aka SET +exports.TINY_BLOB = 0xf9; // aka TINYBLOB, TINYTEXT +exports.MEDIUM_BLOB = 0xfa; // aka MEDIUMBLOB, MEDIUMTEXT +exports.LONG_BLOB = 0xfb; // aka LONGBLOG, LONGTEXT +exports.BLOB = 0xfc; // aka BLOB, TEXT +exports.VAR_STRING = 0xfd; // aka VARCHAR, VARBINARY +exports.STRING = 0xfe; // aka CHAR, BINARY +exports.GEOMETRY = 0xff; // aka GEOMETRY + + +/***/ }), +/* 14 */ +/***/ (function(module, exports) { + +module.exports = require("stream"); + /***/ }), /* 15 */ /***/ (function(module, exports) { @@ -1877,7 +1832,7 @@ exports.UTF32 = exports.UTF32_GENERAL_CI; /* 17 */ /***/ (function(module, exports, __webpack_require__) { -var Types = __webpack_require__(12); +var Types = __webpack_require__(13); module.exports = Field; function Field(options) { @@ -1954,10 +1909,10 @@ Auth.token = function(password, scramble) { // This is a port of sql/password.c:hash_password which needs to be used for // pre-4.1 passwords. Auth.hashPassword = function(password) { - var nr = [0x5030, 0x5735]; - var add = 7; - var nr2 = [0x1234, 0x5671]; - var result = Buffer.alloc(8); + var nr = [0x5030, 0x5735], + add = 7, + nr2 = [0x1234, 0x5671], + result = Buffer.alloc(8); if (typeof password === 'string'){ password = Buffer.from(password); @@ -2005,12 +1960,12 @@ Auth.myRnd = function(r){ }; Auth.scramble323 = function(message, password) { - var to = Buffer.allocUnsafe(8); - var hashPass = this.hashPassword(password); - var hashMessage = this.hashPassword(message.slice(0, 8)); - var seed1 = this.int32Read(hashPass, 0) ^ this.int32Read(hashMessage, 0); - var seed2 = this.int32Read(hashPass, 4) ^ this.int32Read(hashMessage, 4); - var r = this.randomInit(seed1, seed2); + var to = Buffer.allocUnsafe(8), + hashPass = this.hashPassword(password), + hashMessage = this.hashPassword(message.slice(0, 8)), + seed1 = this.int32Read(hashPass, 0) ^ this.int32Read(hashMessage, 0), + seed2 = this.int32Read(hashPass, 4) ^ this.int32Read(hashMessage, 4), + r = this.randomInit(seed1, seed2); for (var i = 0; i < 8; i++){ to[i] = Math.floor(this.myRnd(r) * 31) + 64; @@ -2029,8 +1984,8 @@ Auth.xor32 = function(a, b){ }; Auth.add32 = function(a, b){ - var w1 = a[1] + b[1]; - var w2 = a[0] + b[0] + ((w1 & 0xFFFF0000) >> 16); + var w1 = a[1] + b[1], + w2 = a[0] + b[0] + ((w1 & 0xFFFF0000) >> 16); return [w2 & 0xFFFF, w1 & 0xFFFF]; }; @@ -2038,8 +1993,8 @@ Auth.add32 = function(a, b){ Auth.mul32 = function(a, b){ // based on this example of multiplying 32b ints using 16b // http://www.dsprelated.com/showmessage/89790/1.php - var w1 = a[1] * b[1]; - var w2 = (((a[1] * b[1]) >> 16) & 0xFFFF) + ((a[0] * b[1]) & 0xFFFF) + (a[1] * b[0] & 0xFFFF); + var w1 = a[1] * b[1], + w2 = (((a[1] * b[1]) >> 16) & 0xFFFF) + ((a[0] * b[1]) & 0xFFFF) + (a[1] * b[0] & 0xFFFF); return [w2 & 0xFFFF, w1 & 0xFFFF]; }; @@ -2050,8 +2005,8 @@ Auth.and32 = function(a, b){ Auth.shl32 = function(a, b){ // assume b is 16 or less - var w1 = a[1] << b; - var w2 = (a[0] << b) | ((w1 & 0xFFFF0000) >> 16); + var w1 = a[1] << b, + w2 = (a[0] << b) | ((w1 & 0xFFFF0000) >> 16); return [w2 & 0xFFFF, w1 & 0xFFFF]; }; @@ -2080,8 +2035,8 @@ var Util = __webpack_require__(0); var Packets = __webpack_require__(2); var ResultSet = __webpack_require__(69); var ServerStatus = __webpack_require__(70); -var fs = __webpack_require__(71); -var Readable = __webpack_require__(72); +var fs = __webpack_require__(20); +var Readable = __webpack_require__(71); module.exports = Query; Util.inherits(Query, Sequence); @@ -2257,12 +2212,12 @@ Query.prototype._sendLocalDataFile = function(path) { }; Query.prototype.stream = function(options) { - var self = this; + var self = this, + stream; options = options || {}; options.objectMode = true; - - var stream = new Readable(options); + stream = new Readable(options); stream._read = function() { self._connection && self._connection.resume(); @@ -2297,6 +2252,12 @@ Query.prototype.stream = function(options) { /***/ }), /* 20 */ +/***/ (function(module, exports) { + +module.exports = require("fs"); + +/***/ }), +/* 21 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2325,13 +2286,13 @@ Query.prototype.stream = function(options) { /**/ -var pna = __webpack_require__(10); +var processNextTick = __webpack_require__(11); /**/ module.exports = Readable; /**/ -var isArray = __webpack_require__(73); +var isArray = __webpack_require__(72); /**/ /**/ @@ -2349,11 +2310,12 @@ var EElistenerCount = function (emitter, type) { /**/ /**/ -var Stream = __webpack_require__(21); +var Stream = __webpack_require__(22); /**/ +// TODO(bmeurer): Change this back to const once hole checks are +// properly optimized away early in Ignition+TurboFan. /**/ - var Buffer = __webpack_require__(1).Buffer; var OurUint8Array = global.Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { @@ -2362,7 +2324,6 @@ function _uint8ArrayToBuffer(chunk) { function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } - /**/ /**/ @@ -2380,8 +2341,8 @@ if (debugUtil && debugUtil.debuglog) { } /**/ -var BufferList = __webpack_require__(75); -var destroyImpl = __webpack_require__(22); +var BufferList = __webpack_require__(74); +var destroyImpl = __webpack_require__(23); var StringDecoder; util.inherits(Readable, Stream); @@ -2391,13 +2352,15 @@ var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; function prependListener(emitter, event, fn) { // Sadly this is not cacheable as some libraries bundle their own // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); - - // This is a hack to make sure that our error handler is attached before any - // userland ones. NEVER DO THIS. This is here only because this code needs - // to continue to work with older versions of Node.js that do not include - // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; + if (typeof emitter.prependListener === 'function') { + return emitter.prependListener(event, fn); + } else { + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; + } } function ReadableState(options, stream) { @@ -2405,26 +2368,17 @@ function ReadableState(options, stream) { options = options || {}; - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away this.objectMode = !!options.objectMode; - if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" var hwm = options.highWaterMark; - var readableHwm = options.readableHighWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; - - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. this.highWaterMark = Math.floor(this.highWaterMark); @@ -2471,7 +2425,7 @@ function ReadableState(options, stream) { this.decoder = null; this.encoding = null; if (options.encoding) { - if (!StringDecoder) StringDecoder = __webpack_require__(24).StringDecoder; + if (!StringDecoder) StringDecoder = __webpack_require__(25).StringDecoder; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } @@ -2627,7 +2581,7 @@ Readable.prototype.isPaused = function () { // backwards compatibility. Readable.prototype.setEncoding = function (enc) { - if (!StringDecoder) StringDecoder = __webpack_require__(24).StringDecoder; + if (!StringDecoder) StringDecoder = __webpack_require__(25).StringDecoder; this._readableState.decoder = new StringDecoder(enc); this._readableState.encoding = enc; return this; @@ -2797,7 +2751,7 @@ function emitReadable(stream) { if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; - if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); } } @@ -2816,7 +2770,7 @@ function emitReadable_(stream) { function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; - pna.nextTick(maybeReadMore_, stream, state); + processNextTick(maybeReadMore_, stream, state); } } @@ -2861,7 +2815,7 @@ Readable.prototype.pipe = function (dest, pipeOpts) { var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var endFn = doEnd ? onend : unpipe; - if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); dest.on('unpipe', onunpipe); function onunpipe(readable, unpipeInfo) { @@ -3051,7 +3005,7 @@ Readable.prototype.on = function (ev, fn) { state.readableListening = state.needReadable = true; state.emittedReadable = false; if (!state.reading) { - pna.nextTick(nReadingNextTick, this); + processNextTick(nReadingNextTick, this); } else if (state.length) { emitReadable(this); } @@ -3082,7 +3036,7 @@ Readable.prototype.resume = function () { function resume(stream, state) { if (!state.resumeScheduled) { state.resumeScheduled = true; - pna.nextTick(resume_, stream, state); + processNextTick(resume_, stream, state); } } @@ -3119,19 +3073,18 @@ function flow(stream) { // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. Readable.prototype.wrap = function (stream) { - var _this = this; - var state = this._readableState; var paused = false; + var self = this; stream.on('end', function () { debug('wrapped end'); if (state.decoder && !state.ended) { var chunk = state.decoder.end(); - if (chunk && chunk.length) _this.push(chunk); + if (chunk && chunk.length) self.push(chunk); } - _this.push(null); + self.push(null); }); stream.on('data', function (chunk) { @@ -3141,7 +3094,7 @@ Readable.prototype.wrap = function (stream) { // don't skip over falsy values in objectMode if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - var ret = _this.push(chunk); + var ret = self.push(chunk); if (!ret) { paused = true; stream.pause(); @@ -3162,12 +3115,12 @@ Readable.prototype.wrap = function (stream) { // proxy certain important events. for (var n = 0; n < kProxyEvents.length; n++) { - stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + stream.on(kProxyEvents[n], self.emit.bind(self, kProxyEvents[n])); } // when we try to consume some more bytes, simply unpause the // underlying stream. - this._read = function (n) { + self._read = function (n) { debug('wrapped _read', n); if (paused) { paused = false; @@ -3175,19 +3128,9 @@ Readable.prototype.wrap = function (stream) { } }; - return this; + return self; }; -Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._readableState.highWaterMark; - } -}); - // exposed for testing purposes only. Readable._fromList = fromList; @@ -3300,7 +3243,7 @@ function endReadable(stream) { if (!state.endEmitted) { state.ended = true; - pna.nextTick(endReadableNT, state, stream); + processNextTick(endReadableNT, state, stream); } } @@ -3313,6 +3256,12 @@ function endReadableNT(state, stream) { } } +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + function indexOf(xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; @@ -3321,14 +3270,14 @@ function indexOf(xs, x) { } /***/ }), -/* 21 */ +/* 22 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = __webpack_require__(13); +module.exports = __webpack_require__(14); /***/ }), -/* 22 */ +/* 23 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3336,7 +3285,7 @@ module.exports = __webpack_require__(13); /**/ -var pna = __webpack_require__(10); +var processNextTick = __webpack_require__(11); /**/ // undocumented cb() API, needed for core, not for public API @@ -3350,9 +3299,9 @@ function destroy(err, cb) { if (cb) { cb(err); } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { - pna.nextTick(emitErrorNT, this, err); + processNextTick(emitErrorNT, this, err); } - return this; + return; } // we set destroyed to true before firing error callbacks in order @@ -3369,7 +3318,7 @@ function destroy(err, cb) { this._destroy(err || null, function (err) { if (!cb && err) { - pna.nextTick(emitErrorNT, _this, err); + processNextTick(emitErrorNT, _this, err); if (_this._writableState) { _this._writableState.errorEmitted = true; } @@ -3377,8 +3326,6 @@ function destroy(err, cb) { cb(err); } }); - - return this; } function undestroy() { @@ -3408,7 +3355,7 @@ module.exports = { }; /***/ }), -/* 23 */ +/* 24 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3441,7 +3388,7 @@ module.exports = { /**/ -var pna = __webpack_require__(10); +var processNextTick = __webpack_require__(11); /**/ module.exports = Writable; @@ -3468,7 +3415,7 @@ function CorkedRequest(state) { /* */ /**/ -var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; /**/ /**/ @@ -3484,16 +3431,15 @@ util.inherits = __webpack_require__(7); /**/ var internalUtil = { - deprecate: __webpack_require__(76) + deprecate: __webpack_require__(75) }; /**/ /**/ -var Stream = __webpack_require__(21); +var Stream = __webpack_require__(22); /**/ /**/ - var Buffer = __webpack_require__(1).Buffer; var OurUint8Array = global.Uint8Array || function () {}; function _uint8ArrayToBuffer(chunk) { @@ -3502,10 +3448,9 @@ function _uint8ArrayToBuffer(chunk) { function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } - /**/ -var destroyImpl = __webpack_require__(22); +var destroyImpl = __webpack_require__(23); util.inherits(Writable, Stream); @@ -3516,27 +3461,18 @@ function WritableState(options, stream) { options = options || {}; - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - // object stream flag to indicate whether or not this stream // contains buffers or objects. this.objectMode = !!options.objectMode; - if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() var hwm = options.highWaterMark; - var writableHwm = options.writableHighWaterMark; var defaultHwm = this.objectMode ? 16 : 16 * 1024; - - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints. this.highWaterMark = Math.floor(this.highWaterMark); @@ -3650,7 +3586,6 @@ if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.protot Object.defineProperty(Writable, Symbol.hasInstance, { value: function (object) { if (realHasInstance.call(this, object)) return true; - if (this !== Writable) return false; return object && object._writableState instanceof WritableState; } @@ -3702,7 +3637,7 @@ function writeAfterEnd(stream, cb) { var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb stream.emit('error', er); - pna.nextTick(cb, er); + processNextTick(cb, er); } // Checks that a user-supplied chunk is valid, especially for the particular @@ -3719,7 +3654,7 @@ function validChunk(stream, state, chunk, cb) { } if (er) { stream.emit('error', er); - pna.nextTick(cb, er); + processNextTick(cb, er); valid = false; } return valid; @@ -3728,7 +3663,7 @@ function validChunk(stream, state, chunk, cb) { Writable.prototype.write = function (chunk, encoding, cb) { var state = this._writableState; var ret = false; - var isBuf = !state.objectMode && _isUint8Array(chunk); + var isBuf = _isUint8Array(chunk) && !state.objectMode; if (isBuf && !Buffer.isBuffer(chunk)) { chunk = _uint8ArrayToBuffer(chunk); @@ -3782,16 +3717,6 @@ function decodeChunk(state, chunk, encoding) { return chunk; } -Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._writableState.highWaterMark; - } -}); - // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. @@ -3849,10 +3774,10 @@ function onwriteError(stream, state, sync, er, cb) { if (sync) { // defer the callback if we are being called synchronously // to avoid piling up things on the stack - pna.nextTick(cb, er); + processNextTick(cb, er); // this can emit finish, and it will always happen // after error - pna.nextTick(finishMaybe, stream, state); + processNextTick(finishMaybe, stream, state); stream._writableState.errorEmitted = true; stream.emit('error', er); } else { @@ -3950,7 +3875,6 @@ function clearBuffer(stream, state) { } else { state.corkedRequestsFree = new CorkedRequest(state); } - state.bufferedRequestCount = 0; } else { // Slow case, write chunks one-by-one while (entry) { @@ -3961,7 +3885,6 @@ function clearBuffer(stream, state) { doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; - state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently @@ -3974,6 +3897,7 @@ function clearBuffer(stream, state) { if (entry === null) state.lastBufferedRequest = null; } + state.bufferedRequestCount = 0; state.bufferedRequest = entry; state.bufferProcessing = false; } @@ -4027,7 +3951,7 @@ function prefinish(stream, state) { if (typeof stream._final === 'function') { state.pendingcb++; state.finalCalled = true; - pna.nextTick(callFinal, stream, state); + processNextTick(callFinal, stream, state); } else { state.prefinished = true; stream.emit('prefinish'); @@ -4051,7 +3975,7 @@ function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { - if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + if (state.finished) processNextTick(cb);else stream.once('finish', cb); } state.ended = true; stream.writable = false; @@ -4101,37 +4025,13 @@ Writable.prototype._destroy = function (err, cb) { }; /***/ }), -/* 24 */ +/* 25 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -/**/ - var Buffer = __webpack_require__(1).Buffer; -/**/ var isEncoding = Buffer.isEncoding || function (encoding) { encoding = '' + encoding; @@ -4243,10 +4143,10 @@ StringDecoder.prototype.fillLast = function (buf) { }; // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a -// continuation byte. If an invalid byte is detected, -2 is returned. +// continuation byte. function utf8CheckByte(byte) { if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; - return byte >> 6 === 0x02 ? -1 : -2; + return -1; } // Checks at most 3 bytes at the end of a Buffer in order to detect an @@ -4260,13 +4160,13 @@ function utf8CheckIncomplete(self, buf, i) { if (nb > 0) self.lastNeed = nb - 1; return nb; } - if (--j < i || nb === -2) return 0; + if (--j < i) return 0; nb = utf8CheckByte(buf[j]); if (nb >= 0) { if (nb > 0) self.lastNeed = nb - 2; return nb; } - if (--j < i || nb === -2) return 0; + if (--j < i) return 0; nb = utf8CheckByte(buf[j]); if (nb >= 0) { if (nb > 0) { @@ -4280,7 +4180,7 @@ function utf8CheckIncomplete(self, buf, i) { // Validates as many continuation bytes for a multi-byte UTF-8 character as // needed or are available. If we see a non-continuation byte where we expect // one, we "replace" the validated continuation bytes we've seen so far with -// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// UTF-8 replacement characters ('\ufffd'), to match v8's UTF-8 decoding // behavior. The continuation byte check is included three times in the case // where all of the continuation bytes for a character exist in the same buffer. // It is also done this way as a slight performance increase instead of using a @@ -4288,17 +4188,17 @@ function utf8CheckIncomplete(self, buf, i) { function utf8CheckExtraBytes(self, buf, p) { if ((buf[0] & 0xC0) !== 0x80) { self.lastNeed = 0; - return '\ufffd'; + return '\ufffd'.repeat(p); } if (self.lastNeed > 1 && buf.length > 1) { if ((buf[1] & 0xC0) !== 0x80) { self.lastNeed = 1; - return '\ufffd'; + return '\ufffd'.repeat(p + 1); } if (self.lastNeed > 2 && buf.length > 2) { if ((buf[2] & 0xC0) !== 0x80) { self.lastNeed = 2; - return '\ufffd'; + return '\ufffd'.repeat(p + 2); } } } @@ -4329,11 +4229,11 @@ function utf8Text(buf, i) { return buf.toString('utf8', i, end); } -// For UTF-8, a replacement character is added when ending on a partial -// character. +// For UTF-8, a replacement character for each buffered byte of a (partial) +// character needs to be added to the output. function utf8End(buf) { var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + '\ufffd'; + if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed); return r; } @@ -4403,7 +4303,7 @@ function simpleEnd(buf) { } /***/ }), -/* 25 */ +/* 26 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4483,28 +4383,39 @@ util.inherits = __webpack_require__(7); util.inherits(Transform, Duplex); -function afterTransform(er, data) { - var ts = this._transformState; +function TransformState(stream) { + this.afterTransform = function (er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; + this.writeencoding = null; +} + +function afterTransform(stream, er, data) { + var ts = stream._transformState; ts.transforming = false; var cb = ts.writecb; if (!cb) { - return this.emit('error', new Error('write callback called multiple times')); + return stream.emit('error', new Error('write callback called multiple times')); } ts.writechunk = null; ts.writecb = null; - if (data != null) // single equals check for both `null` and `undefined` - this.push(data); + if (data !== null && data !== undefined) stream.push(data); cb(er); - var rs = this._readableState; + var rs = stream._readableState; rs.reading = false; if (rs.needReadable || rs.length < rs.highWaterMark) { - this._read(rs.highWaterMark); + stream._read(rs.highWaterMark); } } @@ -4513,14 +4424,9 @@ function Transform(options) { Duplex.call(this, options); - this._transformState = { - afterTransform: afterTransform.bind(this), - needTransform: false, - transforming: false, - writecb: null, - writechunk: null, - writeencoding: null - }; + this._transformState = new TransformState(this); + + var stream = this; // start out asking for a readable event once data is transformed. this._readableState.needReadable = true; @@ -4537,19 +4443,11 @@ function Transform(options) { } // When the writable side finishes, then flush out anything remaining. - this.on('prefinish', prefinish); -} - -function prefinish() { - var _this = this; - - if (typeof this._flush === 'function') { - this._flush(function (er, data) { - done(_this, er, data); - }); - } else { - done(this, null, null); - } + this.once('prefinish', function () { + if (typeof this._flush === 'function') this._flush(function (er, data) { + done(stream, er, data); + });else done(stream); + }); } Transform.prototype.push = function (chunk, encoding) { @@ -4599,41 +4497,43 @@ Transform.prototype._read = function (n) { }; Transform.prototype._destroy = function (err, cb) { - var _this2 = this; + var _this = this; Duplex.prototype._destroy.call(this, err, function (err2) { cb(err2); - _this2.emit('close'); + _this.emit('close'); }); }; function done(stream, er, data) { if (er) return stream.emit('error', er); - if (data != null) // single equals check for both `null` and `undefined` - stream.push(data); + if (data !== null && data !== undefined) stream.push(data); // if there's nothing in the write buffer, then that means // that nothing more will ever be provided - if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + var ws = stream._writableState; + var ts = stream._transformState; - if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + if (ws.length) throw new Error('Calling transform done when ws.length != 0'); + + if (ts.transforming) throw new Error('Calling transform done when still transforming'); return stream.push(null); } /***/ }), -/* 26 */ +/* 27 */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(81); /***/ }), -/* 27 */ +/* 28 */ /***/ (function(module, exports, __webpack_require__) { -var mysql = __webpack_require__(14); +var mysql = __webpack_require__(12); var Connection = __webpack_require__(8); var EventEmitter = __webpack_require__(4).EventEmitter; var Util = __webpack_require__(0); @@ -4930,11 +4830,11 @@ function spliceConnection(array, connection) { /***/ }), -/* 28 */ +/* 29 */ /***/ (function(module, exports, __webpack_require__) { -var ConnectionConfig = __webpack_require__(11); +var ConnectionConfig = __webpack_require__(9); module.exports = PoolConfig; function PoolConfig(options) { @@ -4968,7 +4868,7 @@ PoolConfig.prototype.newConnectionConfig = function newConnectionConfig() { /***/ }), -/* 29 */ +/* 30 */ /***/ (function(module, exports) { @@ -5005,172 +4905,240 @@ PoolSelector.ORDER = function PoolSelectorOrder() { /***/ }), -/* 30 */ +/* 31 */ /***/ (function(module, exports, __webpack_require__) { -const mysql = __webpack_require__(14); +const MySQL = __webpack_require__(32); +const Logger = __webpack_require__(86); +const Profiler = __webpack_require__(87); +const parseSettings = __webpack_require__(88); +const { + prepareQuery, typeCast, safeInvoke, sanitizeTransactionInput, +} = __webpack_require__(89); +let logger = null; +let profiler = null; +let mysql = null; let config = {}; -let debug = 0; -let pool; - -function prepareQuery(query, parameters) { - let sql = query; - if (parameters !== null && typeof parameters === 'object') { - sql = query.replace(/@(\w+)/g, (txt, key) => { - if (parameters.hasOwnProperty(key)) { - return mysql.escape(parameters[key]); - } else if (parameters.hasOwnProperty(`@${key}`)) { - return mysql.escape(parameters[`@${key}`]); - } - return txt; - }); - } - return sql; -} - -function writeDebug(time, sql, error) { - if (error) console.log(`[ERROR] [MySQL] An error happens on MySQL for query "${sql}": ${error.message}`) - if (debug) console.log(`[MySQL] [${(time[0]*1e3+time[1]*1e-6).toFixed()}ms] ${sql}`); -} - -async function safeInvoke(callback, args) { - if (typeof callback === 'function') setImmediate(() => { - callback(args); - }); -} - -// transform tinyint(1) to boolean -function useBoolean(fields, results) { - if (fields) { - fields.forEach(field => { - // found a column with tinyint(1) - if (field.type === 1 && field.length === 1) { - results.forEach((_, index) => { - results[index][field.name] = (results[index][field.name] !== 0); - }); - } - }); - } - return results; -} global.exports('mysql_execute', (query, parameters, callback) => { - let sql = prepareQuery(query, parameters); - let start = process.hrtime(); - pool.query(sql, (error, results) => { - writeDebug(process.hrtime(start), sql, error); - safeInvoke(callback, (results) ? results.affectedRows : 0); - }); + const invokingResource = global.GetInvokingResource(); + const sql = prepareQuery(query, parameters); + mysql.execute({ sql, typeCast }, invokingResource).then((result) => { + safeInvoke(callback, (result) ? result.affectedRows : 0); + return true; + }).catch(() => false); }); global.exports('mysql_fetch_all', (query, parameters, callback) => { - let sql = prepareQuery(query, parameters); - let start = process.hrtime(); - pool.query(sql, (error, results, fields) => { - writeDebug(process.hrtime(start), sql, error); - results = useBoolean(fields, results); - safeInvoke(callback, results); - }); + const invokingResource = global.GetInvokingResource(); + const sql = prepareQuery(query, parameters); + mysql.execute({ sql, typeCast }, invokingResource).then((result) => { + safeInvoke(callback, result); + return true; + }).catch(() => false); }); global.exports('mysql_fetch_scalar', (query, parameters, callback) => { - let sql = prepareQuery(query, parameters); - let start = process.hrtime(); - pool.query(sql, (error, results, fields) => { - writeDebug(process.hrtime(start), sql, error); - results = useBoolean(fields, results); - safeInvoke(callback, (results) ? Object.values(results[0])[0] : null); - }); + const invokingResource = global.GetInvokingResource(); + const sql = prepareQuery(query, parameters); + mysql.execute({ sql, typeCast }, invokingResource).then((result) => { + safeInvoke(callback, (result && result[0]) ? Object.values(result[0])[0] : null); + return true; + }).catch(() => false); }); global.exports('mysql_insert', (query, parameters, callback) => { - let sql = prepareQuery(query, parameters); - let start = process.hrtime(); - pool.query(sql, (error, results) => { - writeDebug(process.hrtime(start), sql, error); - safeInvoke(callback, (results) ? results.insertId : 0); - }); + const invokingResource = global.GetInvokingResource(); + const sql = prepareQuery(query, parameters); + mysql.execute({ sql, typeCast }, invokingResource).then((result) => { + safeInvoke(callback, (result) ? result.insertId : 0); + return true; + }).catch(() => false); }); -function parseOptions(config, options) { - const cfg = config; - const opts = options.split('&'); - opts.forEach((o) => { - const keyValue = o.split('='); - cfg[keyValue[0]] = keyValue[1]; +global.exports('mysql_transaction', (querys, values, callback) => { + const invokingResource = global.GetInvokingResource(); + let sqls = []; + let cb = callback; + [sqls, cb] = sanitizeTransactionInput(querys, values, cb); + mysql.beginTransaction((connection) => { + if (!connection) safeInvoke(cb, false); + const promises = []; + sqls.forEach((sql) => { + promises.push(mysql.execute({ sql }, invokingResource, connection)); }); - return cfg; -} - -function parseConnectingString(connectionString) { - if(/(?:database|initial\scatalog)=(?:(.*?);|(.*))/gi.test(connectionString)) { - - let matches = (/(?:host|server|data\s?source|addr(?:ess)?)=(?:(.*?);|(.*))/gi.exec(connectionString)); - const host = (matches) ? matches[1] || matches[2] : 'localhost'; - matches = (/(?:Port)=(?:(.*?);|(.*))/gi.exec(connectionString)); - const port = (matches) ? matches[1] || matches[2] : 3306; - matches = (/(?:user\s?(?:id|name)?|uid)=(?:(.*?);|(.*))/gi.exec(connectionString)); - const user = (matches) ? matches[1] || matches[2] : 'root'; - matches = (/(?:password|pwd)=(?:(.*?);|(.*))/gi.exec(connectionString)); - const password = (matches) ? matches[1] || matches[2] : ''; - matches = (/(?:database|initial\scatalog)=(?:(.*?);|(.*))/gi.exec(connectionString)); - const database = (matches) ? matches[1] || matches[2] : ''; - return { host, port, user, password, database, dateStrings: true }; - - } else if(/mysql:\/\//gi.test(connectionString)) { - - let matches = /mysql:\/\/(.*?)(?::|@)(?:(.*)@)?(.*?)(?::(\d{1,5}))?\/(.*?)\?(.*)/gi.exec(connectionString); - const host = (matches[3]) ? matches[3] : 'localhost'; - const port = (matches[4]) ? matches[4] : 3306; - const user = (matches[1]) ? matches[1] : 'root'; - const password = (matches[2]) ? matches[2] : ''; - const database = (matches[5]) ? matches[5] : ''; - const config = { host, port, user, password, database }; - const options = matches[6]; - return parseOptions(config, options); - - } else throw new Error('No valid connection string found'); -} + mysql.commitTransaction(promises, connection, (result) => { + safeInvoke(cb, result); + }); + }); +}); let isReady = false; +global.exports('is_ready', () => isReady); + global.on('onServerResourceStart', (resourcename) => { - if (resourcename == 'mysql-async') { - const connectionString = global.GetConvar('mysql_connection_string', 'mysql://localhost/'); - config = parseConnectingString(connectionString); - debug = global.GetConvarInt('mysql_debug', 0); - pool = mysql.createPool(config); - global.emit('onMySQLReady'); // avoid ESX bugs - isReady = true; - } - if (isReady) { - global.emit('MySQLReady'); // avoid ESX bugs + if (resourcename === 'mysql-async') { + const trace = global.GetConvarInt('mysql_debug', 0); + const slowQueryWarningTime = global.GetConvarInt('mysql_slow_query_warning', 200); + + logger = new Logger(global.GetConvar('mysql_debug_output', 'console')); + profiler = new Profiler(logger, { trace, slowQueryWarningTime }); + + // needs to move to a new file + const connectionString = global.GetConvar('mysql_connection_string', 'Empty'); + if (connectionString === 'Empty') { + logger.error('Empty mysql_connection_string detected.'); + } else { + config = parseSettings(connectionString); + + mysql = new MySQL(config, logger, profiler); + global.emit('onMySQLReady'); // avoid old ESX bugs + isReady = true; } + } }); +global.onNet('mysql-async:request-data', () => { + if (isReady) { + const src = global.source; + global.emitNet('mysql-async:update-resource-data', src, profiler.profiles.resources); + global.emitNet('mysql-async:update-time-data', src, profiler.profiles.executionTimes); + global.emitNet('mysql-async:update-slow-queries', src, profiler.profiles.slowQueries); + } +}); -/***/ }), -/* 31 */ -/***/ (function(module, exports) { - -module.exports = require("net"); /***/ }), /* 32 */ -/***/ (function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { + +const mysql = __webpack_require__(12); + +function formatVersion(versionString) { + let versionPrefix = 'MariaDB'; + const version = versionString; + if (version[0] === '5' || version[0] === '8') { + versionPrefix = 'MySQL'; + } + return { versionPrefix, version }; +} + +class MySQL { + constructor(mysqlConfig, logger, profiler) { + this.pool = null; + this.profiler = profiler; + this.logger = logger; + if (typeof mysqlConfig === 'object') { + this.pool = mysql.createPool(mysqlConfig); + } else { + this.logger.error(`[ERROR] [MySQL] Unexpected configuration of type ${typeof mysqlconfig} received.`); + } + + this.pool.query('SELECT VERSION()', (error, result) => { + if (!error) { + const { versionPrefix, version } = formatVersion(result[0]['VERSION()']); + profiler.setVersion(`${versionPrefix}:${version}`); + logger.log('\x1b[32m[mysql-async]\x1b[0m Database server connection established.'); + } else { + logger.error(`[ERROR] ${error.message}`); + } + }); + + // for people with faulty network configurations, to keep the handle for timing out + // might be some tcp / udp issue + if (mysqlConfig.keepAlive) { + this.ping(Number(mysqlConfig.keepAlive)); + } + } + + // for people with faulty network configurations, to keep the handle for timing out + // might be some tcp / udp issue + // actual function that keeps the connection alive + ping(keepAliveTimeout) { + if (keepAliveTimeout && keepAliveTimeout > 0) { + this.execute({ sql: 'SELECT 1' }, 'mysql-async:keepAlive').then(() => { + setTimeout(() => this.ping(keepAliveTimeout), keepAliveTimeout * 1000); + }); + } + } + + execute(sql, invokingResource, connection) { + const queryPromise = new Promise((resolve, reject) => { + const start = process.hrtime(); + const db = connection || this.pool; + + db.query(sql, (error, result) => { + this.profiler.profile(process.hrtime(start), sql.sql, invokingResource); + if (error) reject(error); + resolve(result); + }); + }).catch((error) => { + this.logger.error(`[ERROR] [MySQL] [${invokingResource}] An error happens on MySQL for query "${sql.sql}": ${error.message}`); + }); + + return queryPromise; + } + + onTransactionError(error, connection, callback) { + connection.rollback(() => { + this.logger.error(error.message); + callback(false); + }); + } + + beginTransaction(callback) { + this.pool.getConnection((connectionError, connection) => { + if (connectionError) { + this.logger.error(connectionError.message); + callback(false); + return; + } + connection.beginTransaction((transactionError) => { + if (transactionError) this.onTransactionError(transactionError, connection, callback); + else callback(connection); + }); + }); + } + + commitTransaction(promises, connection, callback) { + Promise.all(promises).then(() => { + connection.commit((commitError) => { + if (commitError) this.onTransactionError(commitError, connection, callback); + else callback(true); + }); + // Otherwise catch the error from the execution + }).catch((executeError) => { + this.onTransactionError(executeError, connection, callback); + }); + } +} + +module.exports = MySQL; -module.exports = require("tls"); /***/ }), /* 33 */ /***/ (function(module, exports) { -module.exports = require("url"); +module.exports = require("net"); /***/ }), /* 34 */ /***/ (function(module, exports) { +module.exports = require("tls"); + +/***/ }), +/* 35 */ +/***/ (function(module, exports) { + +module.exports = require("url"); + +/***/ }), +/* 36 */ +/***/ (function(module, exports) { + // Certificates for Amazon RDS exports['Amazon RDS'] = { ca: [ @@ -5651,43 +5619,6 @@ exports['Amazon RDS'] = { + 'igXx7B5GgP+IHb6DTjPJAi0=\n' + '-----END CERTIFICATE-----\n', - /** - * Amazon RDS us-east-2 certificate CA 2016 to 2020 - * - * CN = Amazon RDS us-east-2 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2016-08-11T19:58:45Z/2020-03-05T19:58:45Z - * F = 9B:78:E3:64:7F:74:BC:B2:52:18:CF:13:C3:62:B8:35:9D:3D:5F:B6 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID/DCCAuSgAwIBAgIBTjANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjA4MTExOTU4NDVaFw0y\n' - + 'MDAzMDUxOTU4NDVaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' - + 'UyB1cy1lYXN0LTIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCp\n' - + 'WnnUX7wM0zzstccX+4iXKJa9GR0a2PpvB1paEX4QRCgfhEdQWDaSqyrWNgdVCKkt\n' - + '1aQkWu5j6VAC2XIG7kKoonm1ZdBVyBLqW5lXNywlaiU9yhJkwo8BR+/OqgE+PLt/\n' - + 'EO1mlN0PQudja/XkExCXTO29TG2j7F/O7hox6vTyHNHc0H88zS21uPuBE+jivViS\n' - + 'yzj/BkyoQ85hnkues3f9R6gCGdc+J51JbZnmgzUkvXjAEuKhAm9JksVOxcOKUYe5\n' - + 'ERhn0U9zjzpfbAITIkul97VVa5IxskFFTHIPJbvRKHJkiF6wTJww/tc9wm+fSCJ1\n' - + '+DbQTGZgkQ3bJrqRN29/AgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' - + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBSAHQzUYYZbepwKEMvGdHp8wzHnfDAfBgNV\n' - + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOCAQEA\n' - + 'MbaEzSYZ+aZeTBxf8yi0ta8K4RdwEJsEmP6IhFFQHYUtva2Cynl4Q9tZg3RMsybT\n' - + '9mlnSQQlbN/wqIIXbkrcgFcHoXG9Odm/bDtUwwwDaiEhXVfeQom3G77QHOWMTCGK\n' - + 'qadwuh5msrb17JdXZoXr4PYHDKP7j0ONfAyFNER2+uecblHfRSpVq5UeF3L6ZJb8\n' - + 'fSw/GtAV6an+/0r+Qm+PiI2H5XuZ4GmRJYnGMhqWhBYrY7p3jtVnKcsh39wgfUnW\n' - + 'AvZEZG/yhFyAZW0Essa39LiL5VSq14Y1DOj0wgnhSY/9WHxaAo1HB1T9OeZknYbD\n' - + 'fl/EGSZ0TEvZkENrXcPlVA==\n' - + '-----END CERTIFICATE-----\n', - /** * Amazon RDS ca-central-1 certificate CA 2016 to 2020 * @@ -5760,167 +5691,20 @@ exports['Amazon RDS'] = { + 'JesWxBMXXGoDC1rIYTFO7szwDyOHlCcVXJDNsTJhc32oDWYdeIbW7o/5I+aQsrXZ\n' + 'C96HykZcgWzz6sElrQxUaT3IoMw/5nmw4uWKKnZnxgI9bY4fpQwMeBZ96iHfFxvH\n' + 'mqfEEuC7uUoPofXdBp2ObQ==\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS us-gov-west-1 CA 2017 to 2022 - * - * CN = Amazon RDS us-gov-west-1 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2017-05-19T22:31:19Z/2022-05-18T12:00:00Z - * F = 77:55:8C:C4:5E:71:1F:1B:57:E3:DA:6E:5B:74:27:12:4E:E8:69:E8 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIIECjCCAvKgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZMxCzAJBgNVBAYTAlVT\n' - + 'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' - + 'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' - + 'MSQwIgYDVQQDDBtBbWF6b24gUkRTIEdvdkNsb3VkIFJvb3QgQ0EwHhcNMTcwNTE5\n' - + 'MjIzMTE5WhcNMjIwNTE4MTIwMDAwWjCBkzELMAkGA1UEBhMCVVMxEzARBgNVBAgM\n' - + 'Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoMGUFtYXpvbiBX\n' - + 'ZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxJDAiBgNVBAMM\n' - + 'G0FtYXpvbiBSRFMgdXMtZ292LXdlc3QtMSBDQTCCASIwDQYJKoZIhvcNAQEBBQAD\n' - + 'ggEPADCCAQoCggEBAM8YZLKAzzOdNnoi7Klih26Zkj+OCpDfwx4ZYB6f8L8UoQi5\n' - + '8z9ZtIwMjiJ/kO08P1yl4gfc7YZcNFvhGruQZNat3YNpxwUpQcr4mszjuffbL4uz\n' - + '+/8FBxALdqCVOJ5Q0EVSfz3d9Bd1pUPL7ARtSpy7bn/tUPyQeI+lODYO906C0TQ3\n' - + 'b9bjOsgAdBKkHfjLdsknsOZYYIzYWOJyFJJa0B11XjDUNBy/3IuC0KvDl6At0V5b\n' - + '8M6cWcKhte2hgjwTYepV+/GTadeube1z5z6mWsN5arOAQUtYDLH6Aztq9mCJzLHm\n' - + 'RccBugnGl3fRLJ2VjioN8PoGoN9l9hFBy5fnFgsCAwEAAaNmMGQwDgYDVR0PAQH/\n' - + 'BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFEG7+br8KkvwPd5g\n' - + '71Rvh2stclJbMB8GA1UdIwQYMBaAFEkQz6S4NS5lOYKcDjBSuCcVpdzjMA0GCSqG\n' - + 'SIb3DQEBCwUAA4IBAQBMA327u5ABmhX+aPxljoIbxnydmAFWxW6wNp5+rZrvPig8\n' - + 'zDRqGQWWr7wWOIjfcWugSElYtf/m9KZHG/Z6+NG7nAoUrdcd1h/IQhb+lFQ2b5g9\n' - + 'sVzQv/H2JNkfZA8fL/Ko/Tm/f9tcqe0zrGCtT+5u0Nvz35Wl8CEUKLloS5xEb3k5\n' - + '7D9IhG3fsE3vHWlWrGCk1cKry3j12wdPG5cUsug0vt34u6rdhP+FsM0tHI15Kjch\n' - + 'RuUCvyQecy2ZFNAa3jmd5ycNdL63RWe8oayRBpQBxPPCbHfILxGZEdJbCH9aJ2D/\n' - + 'l8oHIDnvOLdv7/cBjyYuvmprgPtu3QEkbre5Hln/\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS eu-west-3 certificate CA 2017 to 2020 - * - * CN = Amazon RDS eu-west-3 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2017-08-25T21:39:26Z/2020-03-05T21:39:26Z - * F = FD:35:A7:84:60:68:98:00:12:54:ED:34:26:8C:66:0F:72:DD:B2:F4 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID/DCCAuSgAwIBAgIBUTANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNzA4MjUyMTM5MjZaFw0y\n' - + 'MDAzMDUyMTM5MjZaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' - + 'UyBldS13ZXN0LTMgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+\n' - + 'xmlEC/3a4cJH+UPwXCE02lC7Zq5NHd0dn6peMeLN8agb6jW4VfSY0NydjRj2DJZ8\n' - + 'K7wV6sub5NUGT1NuFmvSmdbNR2T59KX0p2dVvxmXHHtIpQ9Y8Aq3ZfhmC5q5Bqgw\n' - + 'tMA1xayDi7HmoPX3R8kk9ktAZQf6lDeksCvok8idjTu9tiSpDiMwds5BjMsWfyjZ\n' - + 'd13PTGGNHYVdP692BSyXzSP1Vj84nJKnciW8tAqwIiadreJt5oXyrCXi8ekUMs80\n' - + 'cUTuGm3aA3Q7PB5ljJMPqz0eVddaiIvmTJ9O3Ez3Du/HpImyMzXjkFaf+oNXf/Hx\n' - + '/EW5jCRR6vEiXJcDRDS7AgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' - + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRZ9mRtS5fHk3ZKhG20Oack4cAqMTAfBgNV\n' - + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOCAQEA\n' - + 'F/u/9L6ExQwD73F/bhCw7PWcwwqsK1mypIdrjdIsu0JSgwWwGCXmrIspA3n3Dqxq\n' - + 'sMhAJD88s9Em7337t+naar2VyLO63MGwjj+vA4mtvQRKq8ScIpiEc7xN6g8HUMsd\n' - + 'gPG9lBGfNjuAZsrGJflrko4HyuSM7zHExMjXLH+CXcv/m3lWOZwnIvlVMa4x0Tz0\n' - + 'A4fklaawryngzeEjuW6zOiYCzjZtPlP8Fw0SpzppJ8VpQfrZ751RDo4yudmPqoPK\n' - + '5EUe36L8U+oYBXnC5TlYs9bpVv9o5wJQI5qA9oQE2eFWxF1E0AyZ4V5sgGUBStaX\n' - + 'BjDDWul0wSo7rt1Tq7XpnA==\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS ap-northeast-3 certificate CA 2017 to 2020 - * - * CN = Amazon RDS ap-northeast-3 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2017-12-01T00:55:42Z/2020-03-05T00:55:42Z - * F = C0:C7:D4:B3:91:40:A0:77:43:28:BF:AF:77:57:DF:FD:98:FB:10:3F - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIIEATCCAumgAwIBAgIBTjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNzEyMDEwMDU1NDJaFw0y\n' - + 'MDAzMDUwMDU1NDJaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' - + 'UyBhcC1ub3J0aGVhc3QtMyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' - + 'ggEBAMZtQNnm/XT19mTa10ftHLzg5UhajoI65JHv4TQNdGXdsv+CQdGYU49BJ9Eu\n' - + '3bYgiEtTzR2lQe9zGMvtuJobLhOWuavzp7IixoIQcHkFHN6wJ1CvqrxgvJfBq6Hy\n' - + 'EuCDCiU+PPDLUNA6XM6Qx3IpHd1wrJkjRB80dhmMSpxmRmx849uFafhN+P1QybsM\n' - + 'TI0o48VON2+vj+mNuQTyLMMP8D4odSQHjaoG+zyJfJGZeAyqQyoOUOFEyQaHC3TT\n' - + '3IDSNCQlpxb9LerbCoKu79WFBBq3CS5cYpg8/fsnV2CniRBFFUumBt5z4dhw9RJU\n' - + 'qlUXXO1ZyzpGd+c5v6FtrfXtnIUCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' - + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFETv7ELNplYy/xTeIOInl6nzeiHg\n' - + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' - + 'A4IBAQCpKxOQcd0tEKb3OtsOY8q/MPwTyustGk2Rt7t9G68idADp8IytB7M0SDRo\n' - + 'wWZqynEq7orQVKdVOanhEWksNDzGp0+FPAf/KpVvdYCd7ru3+iI+V4ZEp2JFdjuZ\n' - + 'Zz0PIjS6AgsZqE5Ri1J+NmfmjGZCPhsHnGZiBaenX6K5VRwwwmLN6xtoqrrfR5zL\n' - + 'QfBeeZNJG6KiM3R/DxJ5rAa6Fz+acrhJ60L7HprhB7SFtj1RCijau3+ZwiGmUOMr\n' - + 'yKlMv+VgmzSw7o4Hbxy1WVrA6zQsTHHSGf+vkQn2PHvnFMUEu/ZLbTDYFNmTLK91\n' - + 'K6o4nMsEvhBKgo4z7H1EqqxXhvN2\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS GovCloud Root CA 2017 to 2022 - * - * CN = Amazon RDS GovCloud Root CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2017-05-19T22:29:11Z/2022-05-18T22:29:11Z - * F = A3:61:F9:C9:A2:5B:91:FE:73:A6:52:E3:59:14:8E:CE:35:12:0F:FD - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIIEDjCCAvagAwIBAgIJAMM61RQn3/kdMA0GCSqGSIb3DQEBCwUAMIGTMQswCQYD\n' - + 'VQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\n' - + 'MCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\n' - + 'em9uIFJEUzEkMCIGA1UEAwwbQW1hem9uIFJEUyBHb3ZDbG91ZCBSb290IENBMB4X\n' - + 'DTE3MDUxOTIyMjkxMVoXDTIyMDUxODIyMjkxMVowgZMxCzAJBgNVBAYTAlVTMRAw\n' - + 'DgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQKDBlB\n' - + 'bWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMSQw\n' - + 'IgYDVQQDDBtBbWF6b24gUkRTIEdvdkNsb3VkIFJvb3QgQ0EwggEiMA0GCSqGSIb3\n' - + 'DQEBAQUAA4IBDwAwggEKAoIBAQDGS9bh1FGiJPT+GRb3C5aKypJVDC1H2gbh6n3u\n' - + 'j8cUiyMXfmm+ak402zdLpSYMaxiQ7oL/B3wEmumIpRDAsQrSp3B/qEeY7ipQGOfh\n' - + 'q2TXjXGIUjiJ/FaoGqkymHRLG+XkNNBtb7MRItsjlMVNELXECwSiMa3nJL2/YyHW\n' - + 'nTr1+11/weeZEKgVbCUrOugFkMXnfZIBSn40j6EnRlO2u/NFU5ksK5ak2+j8raZ7\n' - + 'xW7VXp9S1Tgf1IsWHjGZZZguwCkkh1tHOlHC9gVA3p63WecjrIzcrR/V27atul4m\n' - + 'tn56s5NwFvYPUIx1dbC8IajLUrepVm6XOwdQCfd02DmOyjWJAgMBAAGjYzBhMA4G\n' - + 'A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRJEM+kuDUu\n' - + 'ZTmCnA4wUrgnFaXc4zAfBgNVHSMEGDAWgBRJEM+kuDUuZTmCnA4wUrgnFaXc4zAN\n' - + 'BgkqhkiG9w0BAQsFAAOCAQEAcfA7uirXsNZyI2j4AJFVtOTKOZlQwqbyNducnmlg\n' - + '/5nug9fAkwM4AgvF5bBOD1Hw6khdsccMwIj+1S7wpL+EYb/nSc8G0qe1p/9lZ/mZ\n' - + 'ff5g4JOa26lLuCrZDqAk4TzYnt6sQKfa5ZXVUUn0BK3okhiXS0i+NloMyaBCL7vk\n' - + 'kDwkHwEqflRKfZ9/oFTcCfoiHPA7AdBtaPVr0/Kj9L7k+ouz122huqG5KqX0Zpo8\n' - + 'S0IGvcd2FZjNSNPttNAK7YuBVsZ0m2nIH1SLp//00v7yAHIgytQwwB17PBcp4NXD\n' - + 'pCfTa27ng9mMMC2YLqWQpW4TkqjDin2ZC+5X/mbrjzTvVg==\n' + '-----END CERTIFICATE-----\n' ] }; /***/ }), -/* 35 */ +/* 37 */ /***/ (function(module, exports, __webpack_require__) { -var Parser = __webpack_require__(36); -var Sequences = __webpack_require__(41); +var Parser = __webpack_require__(38); +var Sequences = __webpack_require__(43); var Packets = __webpack_require__(2); -var Stream = __webpack_require__(13).Stream; +var Timers = __webpack_require__(79); +var Stream = __webpack_require__(14).Stream; var Util = __webpack_require__(0); var PacketWriter = __webpack_require__(80); @@ -6072,7 +5856,7 @@ Protocol.prototype._enqueue = function(sequence) { self._delegateError(err, sequence); }) .on('packet', function(packet) { - sequence._timer.active(); + Timers.active(sequence); self._emitPacket(packet); }) .on('end', function() { @@ -6088,7 +5872,7 @@ Protocol.prototype._enqueue = function(sequence) { self._delegateError(err, sequence); }) .on('start-tls', function() { - sequence._timer.active(); + Timers.active(sequence); self._connection._startTLS(function(err) { if (err) { // SSL negotiation error are fatal @@ -6098,7 +5882,7 @@ Protocol.prototype._enqueue = function(sequence) { return; } - sequence._timer.active(); + Timers.active(sequence); sequence._tlsUpgradeCompleteHandler(); }); }); @@ -6183,7 +5967,7 @@ Protocol.prototype._parsePacket = function() { this._handshakeInitializationPacket = packet; } - sequence._timer.active(); + Timers.active(sequence); if (!sequence[packetName]) { var err = new Error('Received packet in the wrong sequence.'); @@ -6240,7 +6024,7 @@ Protocol.prototype._determinePacket = function(sequence) { }; Protocol.prototype._dequeue = function(sequence) { - sequence._timer.stop(); + Timers.unenroll(sequence); // No point in advancing the queue, we are dead if (this._fatalError) { @@ -6262,7 +6046,8 @@ Protocol.prototype._dequeue = function(sequence) { Protocol.prototype._startSequence = function(sequence) { if (sequence._timeout > 0 && isFinite(sequence._timeout)) { - sequence._timer.start(sequence._timeout); + Timers.enroll(sequence, sequence._timeout); + Timers.active(sequence); } if (sequence.constructor === Sequences.ChangeUser) { @@ -6354,16 +6139,11 @@ Protocol.prototype.destroy = function() { }; Protocol.prototype._debugPacket = function(incoming, packet) { - var connection = this._connection; - var headline = incoming + var headline = (incoming) ? '<-- ' : '--> '; - if (connection && connection.threadId !== null) { - headline += '(' + connection.threadId + ') '; - } - - headline += packet.constructor.name; + headline = headline + packet.constructor.name; // check for debug packet restriction if (Array.isArray(this._config.debug) && this._config.debug.indexOf(packet.constructor.name) === -1) { @@ -6377,15 +6157,15 @@ Protocol.prototype._debugPacket = function(incoming, packet) { /***/ }), -/* 36 */ +/* 38 */ /***/ (function(module, exports, __webpack_require__) { var MAX_PACKET_LENGTH = Math.pow(2, 24) - 1; var MUL_32BIT = Math.pow(2, 32); -var PacketHeader = __webpack_require__(37); -var BigNumber = __webpack_require__(38); +var PacketHeader = __webpack_require__(39); +var BigNumber = __webpack_require__(40); var Buffer = __webpack_require__(1).Buffer; -var BufferList = __webpack_require__(40); +var BufferList = __webpack_require__(42); module.exports = Parser; function Parser(options) { @@ -6549,8 +6329,8 @@ Parser.prototype.resume = function() { process.nextTick(this.write.bind(this)); }; -Parser.prototype.peak = function peak(offset) { - return this._buffer[this._offset + (offset >>> 0)]; +Parser.prototype.peak = function() { + return this._buffer[this._offset]; }; Parser.prototype.parseUnsignedNumber = function parseUnsignedNumber(bytes) { @@ -6859,7 +6639,7 @@ Parser.prototype._advanceToNextPacket = function() { /***/ }), -/* 37 */ +/* 39 */ /***/ (function(module, exports) { module.exports = PacketHeader; @@ -6870,16 +6650,16 @@ function PacketHeader(length, number) { /***/ }), -/* 38 */ +/* 40 */ /***/ (function(module, exports, __webpack_require__) { -var __WEBPACK_AMD_DEFINE_RESULT__;/*! bignumber.js v4.1.0 https://github.com/MikeMcl/bignumber.js/LICENCE */ +var __WEBPACK_AMD_DEFINE_RESULT__;/*! bignumber.js v4.0.4 https://github.com/MikeMcl/bignumber.js/LICENCE */ ;(function (globalObj) { 'use strict'; /* - bignumber.js v4.1.0 + bignumber.js v4.0.4 A JavaScript library for arbitrary-precision arithmetic. https://github.com/MikeMcl/bignumber.js Copyright (c) 2017 Michael Mclaughlin @@ -9604,13 +9384,13 @@ var __WEBPACK_AMD_DEFINE_RESULT__;/*! bignumber.js v4.1.0 https://github.com/Mik /***/ }), -/* 39 */ +/* 41 */ /***/ (function(module, exports) { module.exports = require("buffer"); /***/ }), -/* 40 */ +/* 42 */ /***/ (function(module, exports) { @@ -9641,20 +9421,20 @@ BufferList.prototype.push = function push(buf) { /***/ }), -/* 41 */ +/* 43 */ /***/ (function(module, exports, __webpack_require__) { -exports.ChangeUser = __webpack_require__(42); +exports.ChangeUser = __webpack_require__(44); exports.Handshake = __webpack_require__(67); exports.Ping = __webpack_require__(68); exports.Query = __webpack_require__(19); -exports.Quit = __webpack_require__(78); +exports.Quit = __webpack_require__(77); exports.Sequence = __webpack_require__(3); -exports.Statistics = __webpack_require__(79); +exports.Statistics = __webpack_require__(78); /***/ }), -/* 42 */ +/* 44 */ /***/ (function(module, exports, __webpack_require__) { var Sequence = __webpack_require__(3); @@ -9701,7 +9481,7 @@ ChangeUser.prototype['ErrorPacket'] = function(packet) { /***/ }), -/* 43 */ +/* 45 */ /***/ (function(module, exports) { module.exports = AuthSwitchRequestPacket; @@ -9727,7 +9507,7 @@ AuthSwitchRequestPacket.prototype.write = function write(writer) { /***/ }), -/* 44 */ +/* 46 */ /***/ (function(module, exports) { module.exports = AuthSwitchResponsePacket; @@ -9747,7 +9527,7 @@ AuthSwitchResponsePacket.prototype.write = function write(writer) { /***/ }), -/* 45 */ +/* 47 */ /***/ (function(module, exports, __webpack_require__) { var Buffer = __webpack_require__(1).Buffer; @@ -9807,7 +9587,7 @@ ClientAuthenticationPacket.prototype.write = function(writer) { /***/ }), -/* 46 */ +/* 48 */ /***/ (function(module, exports) { module.exports = ComChangeUserPacket; @@ -9839,7 +9619,7 @@ ComChangeUserPacket.prototype.write = function(writer) { /***/ }), -/* 47 */ +/* 49 */ /***/ (function(module, exports) { module.exports = ComPingPacket; @@ -9857,7 +9637,7 @@ ComPingPacket.prototype.parse = function(parser) { /***/ }), -/* 48 */ +/* 50 */ /***/ (function(module, exports) { module.exports = ComQueryPacket; @@ -9878,7 +9658,7 @@ ComQueryPacket.prototype.parse = function(parser) { /***/ }), -/* 49 */ +/* 51 */ /***/ (function(module, exports) { module.exports = ComQuitPacket; @@ -9896,7 +9676,7 @@ ComQuitPacket.prototype.write = function write(writer) { /***/ }), -/* 50 */ +/* 52 */ /***/ (function(module, exports) { module.exports = ComStatisticsPacket; @@ -9914,7 +9694,7 @@ ComStatisticsPacket.prototype.parse = function(parser) { /***/ }), -/* 51 */ +/* 53 */ /***/ (function(module, exports) { module.exports = EmptyPacket; @@ -9926,7 +9706,7 @@ EmptyPacket.prototype.write = function write() { /***/ }), -/* 52 */ +/* 54 */ /***/ (function(module, exports) { module.exports = EofPacket; @@ -9957,7 +9737,7 @@ EofPacket.prototype.write = function(writer) { /***/ }), -/* 53 */ +/* 55 */ /***/ (function(module, exports) { module.exports = ErrorPacket; @@ -9998,7 +9778,7 @@ ErrorPacket.prototype.write = function(writer) { /***/ }), -/* 54 */ +/* 56 */ /***/ (function(module, exports) { module.exports = FieldPacket; @@ -10097,11 +9877,11 @@ FieldPacket.prototype.write = function(writer) { /***/ }), -/* 55 */ +/* 57 */ /***/ (function(module, exports, __webpack_require__) { var Buffer = __webpack_require__(1).Buffer; -var Client = __webpack_require__(9); +var Client = __webpack_require__(10); module.exports = HandshakeInitializationPacket; function HandshakeInitializationPacket(options) { @@ -10206,7 +9986,7 @@ HandshakeInitializationPacket.prototype.scrambleBuff = function() { /***/ }), -/* 56 */ +/* 58 */ /***/ (function(module, exports) { module.exports = LocalDataFilePacket; @@ -10227,7 +10007,7 @@ LocalDataFilePacket.prototype.write = function(writer) { /***/ }), -/* 57 */ +/* 59 */ /***/ (function(module, exports) { @@ -10277,7 +10057,7 @@ OkPacket.prototype.write = function(writer) { /***/ }), -/* 58 */ +/* 60 */ /***/ (function(module, exports) { module.exports = OldPasswordPacket; @@ -10298,7 +10078,7 @@ OldPasswordPacket.prototype.write = function(writer) { /***/ }), -/* 59 */ +/* 61 */ /***/ (function(module, exports) { module.exports = ResultSetHeaderPacket; @@ -10329,10 +10109,10 @@ ResultSetHeaderPacket.prototype.write = function(writer) { /***/ }), -/* 60 */ +/* 62 */ /***/ (function(module, exports, __webpack_require__) { -var Types = __webpack_require__(12); +var Types = __webpack_require__(13); var Charsets = __webpack_require__(16); var Field = __webpack_require__(17); var IEEE_754_BINARY_64_PRECISION = Math.pow(2, 53); @@ -10468,13 +10248,13 @@ function typeMatch(type, list) { /***/ }), -/* 61 */ +/* 63 */ /***/ (function(module, exports, __webpack_require__) { // http://dev.mysql.com/doc/internals/en/ssl.html // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest -var ClientConstants = __webpack_require__(9); +var ClientConstants = __webpack_require__(10); module.exports = SSLRequestPacket; @@ -10501,7 +10281,7 @@ SSLRequestPacket.prototype.write = function(writer) { /***/ }), -/* 62 */ +/* 64 */ /***/ (function(module, exports) { module.exports = StatisticsPacket; @@ -10527,7 +10307,7 @@ StatisticsPacket.prototype.write = function(writer) { /***/ }), -/* 63 */ +/* 65 */ /***/ (function(module, exports) { module.exports = UseOldPasswordPacket; @@ -10547,13 +10327,13 @@ UseOldPasswordPacket.prototype.write = function(writer) { /***/ }), -/* 64 */ +/* 66 */ /***/ (function(module, exports) { /** * MySQL error constants * - * Extracted from version 5.7.21 + * Extracted from version 5.7.19 * * !! Generated by generate-error-constants.js, do not modify by hand !! */ @@ -11756,11 +11536,6 @@ exports.ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO exports.ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID = 3196; exports.ER_XA_RETRY = 3197; exports.ER_KEYRING_AWS_UDF_AWS_KMS_ERROR = 3198; -exports.ER_BINLOG_UNSAFE_XA = 3199; -exports.ER_UDF_ERROR = 3200; -exports.ER_KEYRING_MIGRATION_FAILURE = 3201; -exports.ER_KEYRING_ACCESS_DENIED_ERROR = 3202; -exports.ER_KEYRING_MIGRATION_STATUS = 3203; // Lookup-by-number table exports[1] = 'EE_CANTCREATEFILE'; @@ -12961,58 +12736,8 @@ exports[3195] = 'ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO'; exports[3196] = 'ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID'; exports[3197] = 'ER_XA_RETRY'; exports[3198] = 'ER_KEYRING_AWS_UDF_AWS_KMS_ERROR'; -exports[3199] = 'ER_BINLOG_UNSAFE_XA'; -exports[3200] = 'ER_UDF_ERROR'; -exports[3201] = 'ER_KEYRING_MIGRATION_FAILURE'; -exports[3202] = 'ER_KEYRING_ACCESS_DENIED_ERROR'; -exports[3203] = 'ER_KEYRING_MIGRATION_STATUS'; -/***/ }), -/* 65 */ -/***/ (function(module, exports, __webpack_require__) { - -var Timers = __webpack_require__(66); - -module.exports = Timer; -function Timer(object) { - this._object = object; - this._timeout = null; -} - -Timer.prototype.active = function active() { - if (this._timeout) { - if (this._timeout.refresh) { - this._timeout.refresh(); - } else { - Timers.active(this._timeout); - } - } -}; - -Timer.prototype.start = function start(msecs) { - this.stop(); - this._timeout = Timers.setTimeout(this._onTimeout.bind(this), msecs); -}; - -Timer.prototype.stop = function stop() { - if (this._timeout) { - Timers.clearTimeout(this._timeout); - this._timeout = null; - } -}; - -Timer.prototype._onTimeout = function _onTimeout() { - return this._object._onTimeout(); -}; - - -/***/ }), -/* 66 */ -/***/ (function(module, exports) { - -module.exports = require("timers"); - /***/ }), /* 67 */ /***/ (function(module, exports, __webpack_require__) { @@ -13021,7 +12746,7 @@ var Sequence = __webpack_require__(3); var Util = __webpack_require__(0); var Packets = __webpack_require__(2); var Auth = __webpack_require__(18); -var ClientConstants = __webpack_require__(9); +var ClientConstants = __webpack_require__(10); module.exports = Handshake; Util.inherits(Handshake, Sequence); @@ -13053,6 +12778,12 @@ Handshake.prototype.determinePacket = function determinePacket(firstByte, parser }; Handshake.prototype['AuthSwitchRequestPacket'] = function (packet) { + switch (packet.authMethodName) { + case 'mysql_native_password': + case 'mysql_old_password': + default: + } + if (packet.authMethodName === 'mysql_native_password') { var challenge = packet.authMethodData.slice(0, 20); @@ -13231,15 +12962,9 @@ exports.SERVER_PS_OUT_PARAMS = 4096; /***/ }), /* 71 */ -/***/ (function(module, exports) { - -module.exports = require("fs"); - -/***/ }), -/* 72 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(13); +var Stream = __webpack_require__(14); if (process.env.READABLE_STREAM === 'disable' && Stream) { module.exports = Stream; exports = module.exports = Stream.Readable; @@ -13250,18 +12975,18 @@ if (process.env.READABLE_STREAM === 'disable' && Stream) { exports.PassThrough = Stream.PassThrough; exports.Stream = Stream; } else { - exports = module.exports = __webpack_require__(20); + exports = module.exports = __webpack_require__(21); exports.Stream = Stream || exports; exports.Readable = exports; - exports.Writable = __webpack_require__(23); + exports.Writable = __webpack_require__(24); exports.Duplex = __webpack_require__(5); - exports.Transform = __webpack_require__(25); - exports.PassThrough = __webpack_require__(77); + exports.Transform = __webpack_require__(26); + exports.PassThrough = __webpack_require__(76); } /***/ }), -/* 73 */ +/* 72 */ /***/ (function(module, exports) { var toString = {}.toString; @@ -13272,7 +12997,7 @@ module.exports = Array.isArray || function (arr) { /***/ }), -/* 74 */ +/* 73 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -13301,16 +13026,18 @@ if (typeof Object.create === 'function') { /***/ }), -/* 75 */ +/* 74 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +/**/ + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Buffer = __webpack_require__(1).Buffer; -var util = __webpack_require__(0); +/**/ function copyBuffer(src, target, offset) { src.copy(target, offset); @@ -13378,15 +13105,8 @@ module.exports = function () { return BufferList; }(); -if (util && util.inspect && util.inspect.custom) { - module.exports.prototype[util.inspect.custom] = function () { - var obj = util.inspect({ length: this.length }); - return this.constructor.name + ' ' + obj; - }; -} - /***/ }), -/* 76 */ +/* 75 */ /***/ (function(module, exports, __webpack_require__) { @@ -13398,7 +13118,7 @@ module.exports = __webpack_require__(0).deprecate; /***/ }), -/* 77 */ +/* 76 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13431,7 +13151,7 @@ module.exports = __webpack_require__(0).deprecate; module.exports = PassThrough; -var Transform = __webpack_require__(25); +var Transform = __webpack_require__(26); /**/ var util = __webpack_require__(6); @@ -13451,7 +13171,7 @@ PassThrough.prototype._transform = function (chunk, encoding, cb) { }; /***/ }), -/* 78 */ +/* 77 */ /***/ (function(module, exports, __webpack_require__) { var Sequence = __webpack_require__(3); @@ -13497,7 +13217,7 @@ Quit.prototype.start = function() { /***/ }), -/* 79 */ +/* 78 */ /***/ (function(module, exports, __webpack_require__) { var Sequence = __webpack_require__(3); @@ -13532,6 +13252,12 @@ Statistics.prototype.determinePacket = function determinePacket(firstByte) { }; +/***/ }), +/* 79 */ +/***/ (function(module, exports) { + +module.exports = require("timers"); + /***/ }), /* 80 */ /***/ (function(module, exports, __webpack_require__) { @@ -13845,19 +13571,13 @@ SqlString.format = function format(sql, values, stringifyObjects, timeZone) { } var chunkIndex = 0; - var placeholdersRegex = /\?+/g; + var placeholdersRegex = /\?\??/g; var result = ''; var valuesIndex = 0; var match; while (valuesIndex < values.length && (match = placeholdersRegex.exec(sql))) { - var len = match[0].length; - - if (len > 2) { - continue; - } - - var value = len === 2 + var value = match[0] === '??' ? SqlString.escapeId(values[valuesIndex]) : SqlString.escape(values[valuesIndex], stringifyObjects, timeZone); @@ -14074,10 +13794,10 @@ PoolConnection.prototype._removeFromPool = function _removeFromPool() { /* 84 */ /***/ (function(module, exports, __webpack_require__) { -var Pool = __webpack_require__(27); -var PoolConfig = __webpack_require__(28); +var Pool = __webpack_require__(28); +var PoolConfig = __webpack_require__(29); var PoolNamespace = __webpack_require__(85); -var PoolSelector = __webpack_require__(29); +var PoolSelector = __webpack_require__(30); var Util = __webpack_require__(0); var EventEmitter = __webpack_require__(4).EventEmitter; @@ -14369,7 +14089,7 @@ function _noop() {} /***/ (function(module, exports, __webpack_require__) { var Connection = __webpack_require__(8); -var PoolSelector = __webpack_require__(29); +var PoolSelector = __webpack_require__(30); module.exports = PoolNamespace; @@ -14506,5 +14226,284 @@ PoolNamespace.prototype._getClusterNode = function _getClusterNode() { }; +/***/ }), +/* 86 */ +/***/ (function(module, exports, __webpack_require__) { + +const fs = __webpack_require__(20); + +class Logger { + constructor(output) { + this.output = output; + this.fileStream = null; + if (this.output === 'file' || this.output === 'both') { + this.fileStream = fs.createWriteStream('./mysql-async.log'); + } + this.writeConsole = msg => console.log(msg); + } + + writeFile(msg) { + this.fileStream.write(`${msg}\n`); + } + + log(msg) { + switch (this.output) { + default: + case 'console': + this.writeConsole(msg); + break; + case 'file': + this.writeFile(msg); + break; + case 'both': + this.writeConsole(msg); + this.writeFile(msg); + break; + } + } + + error(msg) { + let errorMsg = msg; + if (this.output !== 'file') { + errorMsg = `\x1b[31m${msg}\x1b[0m`; + } + this.log(errorMsg); + } +} + +module.exports = Logger; + + +/***/ }), +/* 87 */ +/***/ (function(module, exports) { + +const profilerDefaultConfig = { + trace: false, + slowQueryWarningTime: 100, + slowestQueries: 21, + timeInterval: 300000, +}; + +function updateExecutionTimes(object, queryTime) { + let returnObj = null; + + if (object) { + const { totalExecutionTime, queryCount } = object; + + returnObj = { + totalExecutionTime: totalExecutionTime + queryTime, + queryCount: queryCount + 1, + }; + } else { + returnObj = { + totalExecutionTime: queryTime, + queryCount: 1, + }; + } + + return returnObj; +} + +class Profiler { + constructor(logger, config) { + this.version = 'MySQL'; + this.startTime = Date.now(); + this.logger = logger; + this.config = Object.assign({}, profilerDefaultConfig, config); + this.profiles = { + executionTimes: [], + resources: {}, + slowQueries: [], + }; + this.slowQueryLimit = 0; + } + + get getFastestSlowQuery() { + return this.profiles.slowQueries.reduce((acc, cur) => ((cur < acc) ? cur : acc)); + } + + addSlowQuery(sql, resource, queryTime) { + this.profiles.slowQueries.push({ sql, resource, queryTime }); + if (this.profiles.slowQueries.length > this.config.slowestQueries) { + const min = this.getFastestSlowQuery; + this.profiles.slowQueries = this.profiles.slowQueries.filter(el => el !== min); + this.slowQueryLimit = this.getFastestSlowQuery; + } + } + + setVersion(version) { + this.version = version; + } + + fillExecutionTimes(interval) { + for (let i = 0; i < interval; i += 1) { + if (!this.profiles.executionTimes[i]) { + this.profiles.executionTimes[i] = { + totalExecutionTime: 0, + queryCount: 0, + }; + } + } + } + + profile(time, sql, resource) { + const interval = Math.floor((Date.now() - this.startTime) / this.config.timeInterval); + const queryTime = time[0] * 1e3 + time[1] * 1e-6; + + this.profiles.resources[resource] = updateExecutionTimes( + this.profiles.resources[resource], queryTime, + ); + this.profiles.executionTimes[interval] = updateExecutionTimes( + this.profiles.executionTimes[interval], queryTime, + ); + // fix execution times manually + this.fillExecutionTimes(interval); + // todo: cull old intervals + + if (this.slowQueryLimit < queryTime) { + this.addSlowQuery(sql, resource, queryTime); + } + + if (this.slowQueryWarningTime < queryTime) { + this.logger.error(`[${this.version}] [Slow Query Warning] [${resource}] [${queryTime.toFixed()}ms] ${sql}`); + } + + if (this.config.trace) { + this.logger.log(`[${this.version}] [${resource}] [${queryTime.toFixed()}ms] ${sql}`); + } + } +} + +module.exports = Profiler; + + +/***/ }), +/* 88 */ +/***/ (function(module, exports, __webpack_require__) { + +const { parseUrl } = __webpack_require__(9); + +const defaultCfg = { + host: '127.0.0.1', + user: 'root', + database: 'fivem', + supportBigNumbers: true, + multipleStatements: true, +}; + + +function parseConnectingString(connectionString) { + let cfg = {}; + if (/(?:database|initial\scatalog)=(?:(.*?);|(.*))/gi.test(connectionString)) { + // replace the old version with the new one + const connectionStr = connectionString + .replace(/(?:host|server|data\s?source|addr(?:ess)?)=/gi, 'host=') + .replace(/(?:port)=/gi, 'port=') + .replace(/(?:user\s?(?:id|name)?|uid)=/gi, 'user=') + .replace(/(?:password|pwd)=/gi, 'password=') + .replace(/(?:database|initial\scatalog)=/gi, 'database='); + connectionStr.split(';').forEach((el) => { + const equal = el.indexOf('='); + const key = (equal > -1) ? el.substr(0, equal) : el; + const value = (equal > -1) ? el.substr(equal + 1) : ''; + cfg[key] = value; + }); + } else if (/mysql:\/\//gi.test(connectionString)) { + cfg = parseUrl(connectionString); + } else throw new Error('No valid connection string found'); + + return Object.assign({}, defaultCfg, cfg); +} + +module.exports = parseConnectingString; + + +/***/ }), +/* 89 */ +/***/ (function(module, exports, __webpack_require__) { + +const mysql = __webpack_require__(12); + +function safeInvoke(callback, args) { + if (typeof callback === 'function') { + setImmediate(() => { + callback(args); + }); + } +} + +function mysqlEscape(parameters, text, key) { + let result = text; + if (Object.prototype.hasOwnProperty.call(parameters, key)) { + result = mysql.escape(parameters[key]); + } else if (Object.prototype.hasOwnProperty.call(parameters, text)) { + result = mysql.escape(parameters[text]); + } + return result; +} + +function prepareQuery(query, parameters) { + let sql = query; + if (parameters !== null && typeof parameters === 'object') { + sql = query.replace(/@(\w+)/g, (txt, key) => mysqlEscape(parameters, txt, key)); + } + return sql; +} + +function typeCast(field, next) { + let dateString = ''; + switch (field.type) { + case 'DATETIME': + case 'DATETIME2': + case 'TIMESTAMP': + case 'TIMESTAMP2': + case 'NEWDATE': + case 'DATE': + dateString = field.string(); + if (field.type === 'DATE') dateString += ' 00:00:00'; + return (new Date(dateString)).getTime(); + case 'TINY': + if (field.length === 1) { + return (field.string() !== '0'); + } + return next(); + case 'BIT': + return Number(field.buffer()[0]); + default: + return next(); + } +} + +function prepareTransactionLegacyQuery(querys) { + const sqls = querys; + sqls.forEach((element, index) => { + const query = prepareQuery(element.query, element.parameters); + sqls[index] = query; + }); + return sqls; +} + +function sanitizeTransactionInput(querys, params, callback) { + let sqls = []; + let cb = callback; + // if every query is a string we are dealing with syntax type a + if (!querys.every(element => typeof element === 'string')) sqls = querys; + else { + const values = (typeof params === 'function') ? [] : params; + querys.forEach((element) => { + sqls.push({ query: element, parameters: values }); + }); + } + if (typeof params === 'function') cb = params; + sqls = prepareTransactionLegacyQuery(sqls); + return [sqls, cb]; +} + +module.exports = { + safeInvoke, prepareQuery, typeCast, sanitizeTransactionInput, +}; + + /***/ }) /******/ ]); \ No newline at end of file From 2e4dbde564d1a1679035892497032e8fdf83fd29 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 13 Aug 2019 22:16:08 +0700 Subject: [PATCH 006/205] Update the text :v --- readME.txt => readME.md | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) rename readME.txt => readME.md (78%) diff --git a/readME.txt b/readME.md similarity index 78% rename from readME.txt rename to readME.md index 08238a5a..f71cda57 100644 --- a/readME.txt +++ b/readME.md @@ -1,10 +1,14 @@ -Thanks You KASH (github.com/KASHZIN)Who The Original Develop This ESX_KASHACTERS RELEASE And To XxFri3ndlyxX (github.com/XxFri3ndlyxX) +#Thanks You KASH (github.com/KASHZIN)Who The Original Develop This ESX_KASHACTERS RELEASE And To XxFri3ndlyxX (github.com/XxFri3ndlyxX) -this tutorial i made original a little bit use XxFri3ndlyxX tutorial :v +**this tutorial i made original a little bit use XxFri3ndlyxX tutorial :v** -1.Step One [ essentialmode\client\main.lua ] +**_How To Install and fix bug esx_kashacters** + +- Step One [ essentialmode\client\main.lua ] Delete Or Replace This ! + +``` --[[Citizen.CreateThread(function() while true do Citizen.Wait(0) @@ -16,11 +20,14 @@ Delete Or Replace This ! end end end)]]-- +``` -2.Step Two [ es_extended [ LINE : 457 ] client/main.lua ] +- Step Two [ es_extended [ LINE : 457 ] client/main.lua ] This To Fix Cant Open Inventory When You Die And Get Revived Change You Menu interactions to this ! + + ``` ---Menu interactions Citizen.CreateThread(function() while true do @@ -33,8 +40,9 @@ Citizen.CreateThread(function() end end) +``` -3. Step Three +- Step Three To Get Your esx_kashacters work you need do this on your query db SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner' @@ -42,9 +50,10 @@ And This SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'indentifier' Credit @Xnubil -6. Step Six [Fix Datastore] +- Step four [Fix Datastore] Duplicate Your esx_datastore or add This line on your esx_datastore server\main.lua +``` -- Fix was taken from this link -- -- https://forum.fivem.net/t/release-esx-kashacters-multi-character/251613/448?u=xxfri3ndlyxx -- AddEventHandler('esx:playerLoaded', function(source) @@ -101,32 +110,31 @@ AddEventHandler('esx:playerLoaded', function(source) xPlayer.set('dataStores', dataStores) end) +``` Download Link : https://github.com/XxFri3ndlyxX/esx_datastore Credits : https://github.com/XxFri3ndlyxX -5. Step Five [ Fix Ambulance ] +- Step Five [ Fix Ambulance ] This To Fix Die Tele And When Your Get Revived You Cant Open any Menu only F2 Download My File the esx_ambulancejob (or download the lastest version esx_ambulancejob :v) -6. Step Six [ Fix your esx_kashacters identifier ] +- Step Six [ Fix your esx_kashacters identifier ] Download My mysql-async And start on your server.cfg -7. Step Seven [ Fix Your Identifier And Spawn] +- Step Seven [ Fix Your Identifier And Spawn] Download My esx_kashacters Modified And start on your server.cfg Thats All Identifier [esx_kashacters\server\main.lua] maybe thats all you need in Roleplay Server if you wan to change just change it ===--------------------------------------------------------------------=== -Okey Thats All Make My esx_kashacters work properly if you wanna ask -My Discord : Blue.#5108 - -Thank you Again to KASH And XxFri3ndlyxX ! :) -ENJOY YOUR ESX_KASHACTERS - +#OkeyThats All Make My esx_kashacters work properly if you wanna ask +#My Discord : Blue.#5108 +#Thank you Again to KASH And XxFri3ndlyxX ! :) +#ENJOY YOUR ESX_KASHACTERS From 6cc6f126e3a4779c990f903e9b6040e668e230f8 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 13 Aug 2019 22:17:01 +0700 Subject: [PATCH 007/205] Update readME.md --- readME.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readME.md b/readME.md index f71cda57..252382f7 100644 --- a/readME.md +++ b/readME.md @@ -45,10 +45,10 @@ end) - Step Three To Get Your esx_kashacters work you need do this on your query db -SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner' +```SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner' And This SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'indentifier' -Credit @Xnubil +Credit @Xnubil``` - Step four [Fix Datastore] Duplicate Your esx_datastore or add This line on your esx_datastore server\main.lua From 606e18f59ed676b02508ed663061e11473fe5d38 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 13 Aug 2019 22:20:49 +0700 Subject: [PATCH 008/205] Update readME.md --- readME.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/readME.md b/readME.md index 252382f7..c3670827 100644 --- a/readME.md +++ b/readME.md @@ -53,8 +53,7 @@ Credit @Xnubil``` - Step four [Fix Datastore] Duplicate Your esx_datastore or add This line on your esx_datastore server\main.lua -``` --- Fix was taken from this link -- +```-- Fix was taken from this link -- -- https://forum.fivem.net/t/release-esx-kashacters-multi-character/251613/448?u=xxfri3ndlyxx -- AddEventHandler('esx:playerLoaded', function(source) From d10fd018bda2a7ec1d60a0959e0494e0d83b6611 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 13 Aug 2019 22:23:46 +0700 Subject: [PATCH 009/205] Update readME.md --- readME.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/readME.md b/readME.md index c3670827..7d50b345 100644 --- a/readME.md +++ b/readME.md @@ -1,4 +1,4 @@ -#Thanks You KASH (github.com/KASHZIN)Who The Original Develop This ESX_KASHACTERS RELEASE And To XxFri3ndlyxX (github.com/XxFri3ndlyxX) +# Thanks You KASH (github.com/KASHZIN)Who The Original Develop This ESX_KASHACTERS RELEASE And To XxFri3ndlyxX (github.com/XxFri3ndlyxX) **this tutorial i made original a little bit use XxFri3ndlyxX tutorial :v** @@ -129,11 +129,11 @@ you need in Roleplay Server if you wan to change just change it ===--------------------------------------------------------------------=== -#OkeyThats All Make My esx_kashacters work properly if you wanna ask -#My Discord : Blue.#5108 +# OkeyThats All Make My esx_kashacters work properly if you wanna ask +# My Discord : Blue.#5108 -#Thank you Again to KASH And XxFri3ndlyxX ! :) -#ENJOY YOUR ESX_KASHACTERS +# Thank you Again to KASH And XxFri3ndlyxX ! :) +# ENJOY YOUR ESX_KASHACTERS From 006ec7802c073c4d2bdd26d2349cfbe94d29850e Mon Sep 17 00:00:00 2001 From: SW1FT Date: Tue, 13 Aug 2019 20:35:38 +0100 Subject: [PATCH 010/205] typo typo --- readME.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readME.md b/readME.md index 7d50b345..4a83cec2 100644 --- a/readME.md +++ b/readME.md @@ -47,7 +47,7 @@ To Get Your esx_kashacters work you need do this on your query db ```SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner' And This -SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'indentifier' +SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'identifier' Credit @Xnubil``` - Step four [Fix Datastore] From 8766f2772232d27c5ae46076790d12683e85a2e0 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Sun, 18 Aug 2019 02:27:06 +0700 Subject: [PATCH 011/205] Update issue 1 --- readME.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/readME.md b/readME.md index 7d50b345..7b6a15cd 100644 --- a/readME.md +++ b/readME.md @@ -47,7 +47,7 @@ To Get Your esx_kashacters work you need do this on your query db ```SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner' And This -SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'indentifier' +SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'identifier' Credit @Xnubil``` - Step four [Fix Datastore] @@ -114,10 +114,9 @@ end) Download Link : https://github.com/XxFri3ndlyxX/esx_datastore Credits : https://github.com/XxFri3ndlyxX -- Step Five [ Fix Ambulance ] +- Step Five [ Fix Ambulance Or Spawn ] This To Fix Die Tele And When Your Get Revived You Cant Open any Menu only F2 - -Download My File the esx_ambulancejob (or download the lastest version esx_ambulancejob :v) +Or Just Download My File the esx_ambulancejob (or download the lastest version esx_ambulancejob :v) - Step Six [ Fix your esx_kashacters identifier ] Download My mysql-async And start on your server.cfg @@ -127,6 +126,10 @@ Download My esx_kashacters Modified And start on your server.cfg Thats All Identifier [esx_kashacters\server\main.lua] maybe thats all you need in Roleplay Server if you wan to change just change it +- Step Eight [ Fix F6 Can Open Menu ] +try to delete IsDie in the police and mechanic Menu +https://github.com/EbenSantuy/esx_kashacter-TUTORIAL-FIXED-ALL-ISSUE/issues/1#issuecomment-520927465 + ===--------------------------------------------------------------------=== # OkeyThats All Make My esx_kashacters work properly if you wanna ask From 03ea592407129d44113e4cd643a77124b70083e4 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 17 Sep 2019 17:24:45 +0700 Subject: [PATCH 012/205] Update Tutorial --- readME.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readME.md b/readME.md index 7b6a15cd..48e30149 100644 --- a/readME.md +++ b/readME.md @@ -43,7 +43,7 @@ end) ``` - Step Three -To Get Your esx_kashacters work you need do this on your query db +To Get Your esx_kashacters work you need do this on your query if you wan to check what is the owner and identifier tables ```SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner' And This From f7e53577b3d461569055ffc83df4c20aebf3bd36 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 17 Sep 2019 17:24:51 +0700 Subject: [PATCH 013/205] Update Tutorial From 50d1e143a35f08a533d5b47275ff6cc02f21a08b Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 17 Sep 2019 17:24:52 +0700 Subject: [PATCH 014/205] Update Tutorial From 0eecd794635382afbf141038a6608b175bac826b Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 17 Sep 2019 11:17:09 +0000 Subject: [PATCH 015/205] Fixed Bug Recconect When Die when your die and you recconect you still alive and your item not removed --- esx_ambulancejob/client/main.lua | 38 +++++++-- esx_ambulancejob/config.lua | 127 +++++++++++++++++++++++++++---- 2 files changed, 143 insertions(+), 22 deletions(-) diff --git a/esx_ambulancejob/client/main.lua b/esx_ambulancejob/client/main.lua index 3a8f2c36..6c6f38a9 100644 --- a/esx_ambulancejob/client/main.lua +++ b/esx_ambulancejob/client/main.lua @@ -40,7 +40,7 @@ AddEventHandler('esx:setJob', function(job) ESX.PlayerData.job = job end) -AddEventHandler('playerSpawned', function() +--[[AddEventHandler('playerSpawned', function() IsDead = false if FirstSpawn then @@ -58,6 +58,18 @@ AddEventHandler('playerSpawned', function() end end) end +end)]] + +RegisterNetEvent('esx_ambulancejob:multicharacter') +AddEventHandler('esx_ambulancejob:multicharacter', function() + IsDead = false + + ESX.TriggerServerCallback('esx_ambulancejob:getDeathStatus', function(isDead) + if isDead and Config.AntiCombatLog then + ESX.ShowNotification(_U('combatlog_message')) + RemoveItemsAfterRPDeath() + end + end) end) -- Create blips @@ -180,13 +192,15 @@ end function SendDistressSignal() local playerPed = PlayerPedId() - local coords = GetEntityCoords(playerPed) + PedPosition = GetEntityCoords(playerPed) + + local PlayerCoords = { x = PedPosition.x, y = PedPosition.y, z = PedPosition.z } ESX.ShowNotification(_U('distress_sent')) - TriggerServerEvent('esx_phone:send', 'ambulance', _U('distress_message'), false, { - x = coords.x, - y = coords.y, - z = coords.z + + TriggerServerEvent('esx_addons_gcphone:startCall', 'ambulance', _U('distress_message'), PlayerCoords, { + + PlayerCoords = { x = PedPosition.x, y = PedPosition.y, z = PedPosition.z }, }) end @@ -332,13 +346,23 @@ function RemoveItemsAfterRPDeath() end) end -function RespawnPed(ped, coords, heading) +--[[function RespawnPed(ped, coords, heading) SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false, false, true) NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, heading, true, false) SetPlayerInvincible(ped, false) TriggerEvent('playerSpawned', coords.x, coords.y, coords.z) ClearPedBloodDamage(ped) + ESX.UI.Menu.CloseAll() +end]] + +function RespawnPed(ped, coords, heading) + SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false, false, true) + NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, heading, true, false) + SetPlayerInvincible(ped, false) + TriggerEvent('esx_ambulancejob:multicharacter', coords.x, coords.y, coords.z) + ClearPedBloodDamage(ped) + ESX.UI.Menu.CloseAll() end diff --git a/esx_ambulancejob/config.lua b/esx_ambulancejob/config.lua index 388b975f..4eedd0e7 100644 --- a/esx_ambulancejob/config.lua +++ b/esx_ambulancejob/config.lua @@ -2,9 +2,9 @@ Config = {} Config.DrawDistance = 100.0 -Config.Marker = { type = 21, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = true } +Config.Marker = { type = 21, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 255, b = 102, a = 100, rotate = true } -Config.ReviveReward = 350 -- revive reward, set to 0 if you don't want it enabled +Config.ReviveReward = 250 -- revive reward, set to 0 if you don't want it enabled Config.AntiCombatLog = true -- enable anti-combat logging? Config.LoadIpl = true -- disable if you're using fivem-ipl or other IPL loaders @@ -26,34 +26,34 @@ Config.RemoveItemsAfterRPDeath = true Config.EarlyRespawnFine = false Config.EarlyRespawnFineAmount = 5000 -Config.RespawnPoint = { coords = vector3(281.27, -581.24, 42.75), heading = 65.5 } +Config.RespawnPoint = { coords = vector3(341.0, -1397.3, 32.5), heading = 48.5 } Config.Hospitals = { CentralLosSantos = { Blip = { - coords = vector3(289.71, -585.82, 42.19), + coords = vector3(332.86, -1389.43, 32.5), sprite = 61, scale = 1.2, color = 2 }, AmbulanceActions = { - vector3(310.48, -599.23, 43.29) + vector3(348.85, -1424.7, 32.94) }, Pharmacies = { - vector3(270.5, -1363.22, 24.53) + vector3(359.44, -1387.91, 32.43) }, - + Vehicles = { { - Spawner = vector3(295.27, -600.8, 43.3), + Spawner = vector3(304.5, -1432.39, 29.93), InsideShop = vector3(446.7, -1355.6, 43.5), Marker = { type = 36, x = 1.0, y = 1.0, z = 1.0, r = 100, g = 50, b = 200, a = 100, rotate = true }, SpawnPoints = { - { coords = vector3(290.26, -599.41, 43.15), heading = 151.5, radius = 1.0 }, + { coords = vector3(297.2, -1429.5, 29.8), heading = 227.6, radius = 4.0 }, { coords = vector3(294.0, -1433.1, 29.8), heading = 227.6, radius = 4.0 }, { coords = vector3(309.4, -1442.5, 29.8), heading = 227.6, radius = 6.0 } } @@ -62,11 +62,11 @@ Config.Hospitals = { Helicopters = { { - Spawner = vector3(345.46, -580.32, 74.16), + Spawner = vector3(317.5, -1449.5, 46.5), InsideShop = vector3(305.6, -1419.7, 41.5), Marker = { type = 34, x = 1.5, y = 1.5, z = 1.5, r = 100, g = 150, b = 150, a = 100, rotate = true }, SpawnPoints = { - { coords = vector3(352.06, -588.03, 74.16), heading = 330.5, radius = 10.0 }, + { coords = vector3(313.5, -1465.1, 46.5), heading = 142.7, radius = 10.0 }, { coords = vector3(299.5, -1453.2, 46.5), heading = 142.7, radius = 10.0 } } } @@ -98,14 +98,110 @@ Config.Hospitals = { }, { - From = vector3(298.57, -584.43, 42.28), - To = { coords = vector3(303.48, -586.12, 42.29), heading = 0.0 }, + From = vector3(298.58, -599.69, 42.4), + To = { coords = vector3(337.67, -594.29, 27.83), heading = 70.88 }, Marker = { type = 1, x = 1.5, y = 1.5, z = 1.0, r = 102, g = 0, b = 102, a = 100, rotate = false } }, { - From = vector3(300.57, -585.11, 42.31), - To = { coords = vector3(296.79, -584.34, 42.16), heading = 0.0 }, + From = vector3(340.55, -595.33, 27.8), + To = { coords = vector3(299.35, -597.53, 42.4), heading = 335.43 }, + Marker = { type = 1, x = 1.5, y = 1.5, z = 1.0, r = 102, g = 0, b = 102, a = 100, rotate = false } + } + }, + + FastTravelsPrompt = { + { + From = vector3(237.4, -1373.8, 26.0), + To = { coords = vector3(251.9, -1363.3, 38.5), heading = 0.0 }, + Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false }, + Prompt = _U('fast_travel') + }, + + { + From = vector3(256.5, -1357.7, 36.0), + To = { coords = vector3(235.4, -1372.8, 26.3), heading = 0.0 }, + Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false }, + Prompt = _U('fast_travel') + } + } + + }, + + + HOSPITAL2 = { + + Blip = { + coords = vector3(289.71, -585.82, 42.19), + sprite = 61, + scale = 1.2, + color = 2 + }, + + AmbulanceActions = { + vector3(310.48, -599.23, 43.29) + }, + + Pharmacies = { + vector3(270.5, -1363.22, 24.53) + }, + + Vehicles = { + { + Spawner = vector3(295.27, -600.8, 43.3), + InsideShop = vector3(446.7, -1355.6, 43.5), + Marker = { type = 36, x = 1.0, y = 1.0, z = 1.0, r = 100, g = 50, b = 200, a = 100, rotate = true }, + SpawnPoints = { + { coords = vector3(290.26, -599.41, 43.15), heading = 151.5, radius = 1.0 } + } + } + }, + + Helicopters = { + { + Spawner = vector3(345.46, -580.32, 74.16), + InsideShop = vector3(305.6, -1419.7, 41.5), + Marker = { type = 34, x = 1.5, y = 1.5, z = 1.5, r = 100, g = 150, b = 150, a = 100, rotate = true }, + SpawnPoints = { + { coords = vector3(352.06, -588.03, 74.16), heading = 330.5, radius = 10.0 }, + } + } + }, + + FastTravels = { + { + From = vector3(0, 0, 0.0), + To = { coords = vector3(272.8, -1358.8, 23.5), heading = 0.0 }, + Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } + }, + + { + From = vector3(275.3, -1361, 23.5), + To = { coords = vector3(295.8, -1446.5, 28.9), heading = 0.0 }, + Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } + }, + + { + From = vector3(247.3, -1371.5, 23.5), + To = { coords = vector3(333.1, -1434.9, 45.5), heading = 138.6 }, + Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } + }, + + { + From = vector3(335.5, -1432.0, 45.50), + To = { coords = vector3(249.1, -1369.6, 23.5), heading = 0.0 }, + Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } + }, + + { + From = vector3(234.5, -1373.7, 20.9), + To = { coords = vector3(320.9, -1478.6, 28.8), heading = 0.0 }, + Marker = { type = 1, x = 1.5, y = 1.5, z = 1.0, r = 102, g = 0, b = 102, a = 100, rotate = false } + }, + + { + From = vector3(317.9, -1476.1, 28.9), + To = { coords = vector3(238.6, -1368.4, 23.5), heading = 0.0 }, Marker = { type = 1, x = 1.5, y = 1.5, z = 1.0, r = 102, g = 0, b = 102, a = 100, rotate = false } } }, @@ -129,6 +225,7 @@ Config.Hospitals = { } } + Config.AuthorizedVehicles = { ambulance = { From 460665d1d795d033b6faee4a4be7ee1694ce5685 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 17 Sep 2019 11:17:44 +0000 Subject: [PATCH 016/205] Fix Bug When Die Reconnect when your die and you recconect you still alive and your item not removed From 5ba5f685abe0d322012ddc42db89a5c67c66a4c8 Mon Sep 17 00:00:00 2001 From: EbenSantuy <50954825+EbenSantuy@users.noreply.github.com> Date: Tue, 17 Sep 2019 11:20:53 +0000 Subject: [PATCH 017/205] Update Changelog --- readME.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/readME.md b/readME.md index 48e30149..908f504a 100644 --- a/readME.md +++ b/readME.md @@ -4,6 +4,9 @@ **_How To Install and fix bug esx_kashacters** +Change Log : +esx_ambulancejob : Fixed The Bug When You Die And You Reconnect And You still alive with your item ! + - Step One [ essentialmode\client\main.lua ] Delete Or Replace This ! From f21e2be4171c633eed3da1e907e8fad88ac1ae58 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 14:57:31 +0100 Subject: [PATCH 018/205] Add support for latest ESX (1/2) --- esx_ambulancejob/LICENSE | 674 - esx_ambulancejob/README.md | 48 - esx_ambulancejob/__resource.lua | 40 - esx_ambulancejob/client/job.lua | 918 - esx_ambulancejob/client/main.lua | 420 - esx_ambulancejob/config.lua | 272 - esx_ambulancejob/esx_ambulancejob.sql | 33 - esx_ambulancejob/locales/br.lua | 90 - esx_ambulancejob/locales/cs.lua | 90 - esx_ambulancejob/locales/en.lua | 90 - esx_ambulancejob/locales/es.lua | 90 - esx_ambulancejob/locales/fi.lua | 90 - esx_ambulancejob/locales/fr.lua | 90 - esx_ambulancejob/locales/pl.lua | 90 - esx_ambulancejob/locales/sv.lua | 90 - .../localization/cs_esx_ambulancejob.sql | 33 - .../localization/de_esx_ambulancejob.sql | 33 - .../localization/en_esx_ambulancejob.sql | 33 - .../localization/fi_esx_ambulancejob.sql | 33 - .../localization/pl_esx_ambulancejob.sql | 33 - esx_ambulancejob/server/main.lua | 306 - esx_kashacter-edited-bluebens.zip | Bin 193522 -> 0 bytes mysql-async/.editorconfig | 13 - mysql-async/.gitignore | 4 - mysql-async/LICENSE | 14 - mysql-async/README.md | 137 - mysql-async/UPGRADING.md | 55 - mysql-async/__resource.lua | 24 - mysql-async/example.lua | 84 - mysql-async/lib/MySQL.lua | 212 - mysql-async/mysql-async-client.js | 219 - mysql-async/mysql-async.js | 14509 ---------------- mysql-async/src/mysql.js | 139 - mysql-async/src/package.json | 22 - mysql-async/src/webpack.config.js | 14 - readME.md | 150 +- 36 files changed, 9 insertions(+), 19183 deletions(-) delete mode 100644 esx_ambulancejob/LICENSE delete mode 100644 esx_ambulancejob/README.md delete mode 100644 esx_ambulancejob/__resource.lua delete mode 100644 esx_ambulancejob/client/job.lua delete mode 100644 esx_ambulancejob/client/main.lua delete mode 100644 esx_ambulancejob/config.lua delete mode 100644 esx_ambulancejob/esx_ambulancejob.sql delete mode 100644 esx_ambulancejob/locales/br.lua delete mode 100644 esx_ambulancejob/locales/cs.lua delete mode 100644 esx_ambulancejob/locales/en.lua delete mode 100644 esx_ambulancejob/locales/es.lua delete mode 100644 esx_ambulancejob/locales/fi.lua delete mode 100644 esx_ambulancejob/locales/fr.lua delete mode 100644 esx_ambulancejob/locales/pl.lua delete mode 100644 esx_ambulancejob/locales/sv.lua delete mode 100644 esx_ambulancejob/localization/cs_esx_ambulancejob.sql delete mode 100644 esx_ambulancejob/localization/de_esx_ambulancejob.sql delete mode 100644 esx_ambulancejob/localization/en_esx_ambulancejob.sql delete mode 100644 esx_ambulancejob/localization/fi_esx_ambulancejob.sql delete mode 100644 esx_ambulancejob/localization/pl_esx_ambulancejob.sql delete mode 100644 esx_ambulancejob/server/main.lua delete mode 100644 esx_kashacter-edited-bluebens.zip delete mode 100644 mysql-async/.editorconfig delete mode 100644 mysql-async/.gitignore delete mode 100644 mysql-async/LICENSE delete mode 100644 mysql-async/README.md delete mode 100644 mysql-async/UPGRADING.md delete mode 100644 mysql-async/__resource.lua delete mode 100644 mysql-async/example.lua delete mode 100644 mysql-async/lib/MySQL.lua delete mode 100644 mysql-async/mysql-async-client.js delete mode 100644 mysql-async/mysql-async.js delete mode 100644 mysql-async/src/mysql.js delete mode 100644 mysql-async/src/package.json delete mode 100644 mysql-async/src/webpack.config.js diff --git a/esx_ambulancejob/LICENSE b/esx_ambulancejob/LICENSE deleted file mode 100644 index dcfcef62..00000000 --- a/esx_ambulancejob/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - fxserver-esx_ambulancejob - Copyright (C) 2015 Jérémie N'gadi - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - fxserver-esx_ambulancejob Copyright (C) 2015 Jérémie N'gadi - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/esx_ambulancejob/README.md b/esx_ambulancejob/README.md deleted file mode 100644 index f2c3b451..00000000 --- a/esx_ambulancejob/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# esx_ambulancejob - -## Requirements - -* Auto mode - - [esx_skin](https://github.com/ESX-Org/esx_skin) - - [esx_vehicleshop](https://github.com/ESX-Org/esx_vehicleshop) - -* Player management (boss actions) - - [esx_society](https://github.com/ESX-Org/esx_society) - -## Download & Installation - -### Using [fvm](https://github.com/qlaffont/fvm-installer) -``` -fvm install --save --folder=esx esx-org/esx_ambulancejob -``` - -### Using Git -``` -cd resources -git clone https://github.com/ESX-Org/esx_ambulancejob [esx]/esx_ambulancejob -``` - -### Manually -- Download https://github.com/ESX-Org/esx_ambulancejob/archive/master.zip -- Put it in the `[esx]` directory - -## Installation -- Import `esx_ambulancejob.sql` in your database -- If you want player management you have to set `Config.EnablePlayerManagement` to `true` in `config.lua` -- Add this in your `server.cfg`: - -``` -start esx_ambulancejob -``` - -# Legal -### License -esx_ambulancejob - ambulance script for fivem - -Copyright (C) 2015-2018 Jérémie N'gadi - -This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. - -This program Is distributed In the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty Of MERCHANTABILITY Or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License For more details. - -You should have received a copy Of the GNU General Public License along with this program. If Not, see http://www.gnu.org/licenses/. diff --git a/esx_ambulancejob/__resource.lua b/esx_ambulancejob/__resource.lua deleted file mode 100644 index 5c55606b..00000000 --- a/esx_ambulancejob/__resource.lua +++ /dev/null @@ -1,40 +0,0 @@ -resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' - -description 'ESX Ambulance Job' - -version '1.2.0' - -server_scripts { - '@mysql-async/lib/MySQL.lua', - '@es_extended/locale.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/es.lua', - 'locales/sv.lua', - 'locales/pl.lua', - 'locales/cs.lua', - 'config.lua', - 'server/main.lua' -} - -client_scripts { - '@es_extended/locale.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/es.lua', - 'locales/sv.lua', - 'locales/pl.lua', - 'locales/cs.lua', - 'config.lua', - 'client/main.lua', - 'client/job.lua' -} - -dependencies { - 'es_extended', - 'esx_vehicleshop' -} \ No newline at end of file diff --git a/esx_ambulancejob/client/job.lua b/esx_ambulancejob/client/job.lua deleted file mode 100644 index 94e5a782..00000000 --- a/esx_ambulancejob/client/job.lua +++ /dev/null @@ -1,918 +0,0 @@ -local CurrentAction, CurrentActionMsg, CurrentActionData = nil, '', {} -local HasAlreadyEnteredMarker, LastHospital, LastPart, LastPartNum -local IsBusy = false -local spawnedVehicles, isInShopMenu = {}, false - -function OpenAmbulanceActionsMenu() - local elements = { - {label = _U('cloakroom'), value = 'cloakroom'} - } - - if Config.EnablePlayerManagement and ESX.PlayerData.job.grade_name == 'boss' then - table.insert(elements, {label = _U('boss_actions'), value = 'boss_actions'}) - end - - ESX.UI.Menu.CloseAll() - - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'ambulance_actions', { - title = _U('ambulance'), - align = 'top-left', - elements = elements - }, function(data, menu) - if data.current.value == 'cloakroom' then - OpenCloakroomMenu() - elseif data.current.value == 'boss_actions' then - TriggerEvent('esx_society:openBossMenu', 'ambulance', function(data, menu) - menu.close() - end, {wash = false}) - end - end, function(data, menu) - menu.close() - end) -end - -function OpenMobileAmbulanceActionsMenu() - - ESX.UI.Menu.CloseAll() - - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'mobile_ambulance_actions', { - title = _U('ambulance'), - align = 'top-left', - elements = { - {label = _U('ems_menu'), value = 'citizen_interaction'} - } - }, function(data, menu) - if data.current.value == 'citizen_interaction' then - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'citizen_interaction', { - title = _U('ems_menu_title'), - align = 'top-left', - elements = { - {label = _U('ems_menu_revive'), value = 'revive'}, - {label = _U('ems_menu_small'), value = 'small'}, - {label = _U('ems_menu_big'), value = 'big'}, - {label = _U('ems_menu_putincar'), value = 'put_in_vehicle'} - } - }, function(data, menu) - if IsBusy then return end - - local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer() - - if closestPlayer == -1 or closestDistance > 1.0 then - ESX.ShowNotification(_U('no_players')) - else - - if data.current.value == 'revive' then - - IsBusy = true - - ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(quantity) - if quantity > 0 then - local closestPlayerPed = GetPlayerPed(closestPlayer) - - if IsPedDeadOrDying(closestPlayerPed, 1) then - local playerPed = PlayerPedId() - - ESX.ShowNotification(_U('revive_inprogress')) - - local lib, anim = 'mini@cpr@char_a@cpr_str', 'cpr_pumpchest' - - for i=1, 15, 1 do - Citizen.Wait(900) - - ESX.Streaming.RequestAnimDict(lib, function() - TaskPlayAnim(PlayerPedId(), lib, anim, 8.0, -8.0, -1, 0, 0, false, false, false) - end) - end - - TriggerServerEvent('esx_ambulancejob:removeItem', 'medikit') - TriggerServerEvent('esx_ambulancejob:revive', GetPlayerServerId(closestPlayer)) - - -- Show revive award? - if Config.ReviveReward > 0 then - ESX.ShowNotification(_U('revive_complete_award', GetPlayerName(closestPlayer), Config.ReviveReward)) - else - ESX.ShowNotification(_U('revive_complete', GetPlayerName(closestPlayer))) - end - else - ESX.ShowNotification(_U('player_not_unconscious')) - end - else - ESX.ShowNotification(_U('not_enough_medikit')) - end - - IsBusy = false - - end, 'medikit') - - elseif data.current.value == 'small' then - - ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(quantity) - if quantity > 0 then - local closestPlayerPed = GetPlayerPed(closestPlayer) - local health = GetEntityHealth(closestPlayerPed) - - if health > 0 then - local playerPed = PlayerPedId() - - IsBusy = true - ESX.ShowNotification(_U('heal_inprogress')) - TaskStartScenarioInPlace(playerPed, 'CODE_HUMAN_MEDIC_TEND_TO_DEAD', 0, true) - Citizen.Wait(10000) - ClearPedTasks(playerPed) - - TriggerServerEvent('esx_ambulancejob:removeItem', 'bandage') - TriggerServerEvent('esx_ambulancejob:heal', GetPlayerServerId(closestPlayer), 'small') - ESX.ShowNotification(_U('heal_complete', GetPlayerName(closestPlayer))) - IsBusy = false - else - ESX.ShowNotification(_U('player_not_conscious')) - end - else - ESX.ShowNotification(_U('not_enough_bandage')) - end - end, 'bandage') - - elseif data.current.value == 'big' then - - ESX.TriggerServerCallback('esx_ambulancejob:getItemAmount', function(quantity) - if quantity > 0 then - local closestPlayerPed = GetPlayerPed(closestPlayer) - local health = GetEntityHealth(closestPlayerPed) - - if health > 0 then - local playerPed = PlayerPedId() - - IsBusy = true - ESX.ShowNotification(_U('heal_inprogress')) - TaskStartScenarioInPlace(playerPed, 'CODE_HUMAN_MEDIC_TEND_TO_DEAD', 0, true) - Citizen.Wait(10000) - ClearPedTasks(playerPed) - - TriggerServerEvent('esx_ambulancejob:removeItem', 'medikit') - TriggerServerEvent('esx_ambulancejob:heal', GetPlayerServerId(closestPlayer), 'big') - ESX.ShowNotification(_U('heal_complete', GetPlayerName(closestPlayer))) - IsBusy = false - else - ESX.ShowNotification(_U('player_not_conscious')) - end - else - ESX.ShowNotification(_U('not_enough_medikit')) - end - end, 'medikit') - - elseif data.current.value == 'put_in_vehicle' then - TriggerServerEvent('esx_ambulancejob:putInVehicle', GetPlayerServerId(closestPlayer)) - end - end - end, function(data, menu) - menu.close() - end) - end - - end, function(data, menu) - menu.close() - end) -end - -function FastTravel(coords, heading) - local playerPed = PlayerPedId() - - DoScreenFadeOut(800) - - while not IsScreenFadedOut() do - Citizen.Wait(500) - end - - ESX.Game.Teleport(playerPed, coords, function() - DoScreenFadeIn(800) - - if heading then - SetEntityHeading(playerPed, heading) - end - end) -end - --- Draw markers & Marker logic -Citizen.CreateThread(function() - while true do - Citizen.Wait(0) - local playerCoords = GetEntityCoords(PlayerPedId()) - local letSleep, isInMarker, hasExited = true, false, false - local currentHospital, currentPart, currentPartNum - - for hospitalNum,hospital in pairs(Config.Hospitals) do - - -- Ambulance Actions - for k,v in ipairs(hospital.AmbulanceActions) do - local distance = GetDistanceBetweenCoords(playerCoords, v, true) - - if distance < Config.DrawDistance then - DrawMarker(Config.Marker.type, v, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Config.Marker.x, Config.Marker.y, Config.Marker.z, Config.Marker.r, Config.Marker.g, Config.Marker.b, Config.Marker.a, false, false, 2, Config.Marker.rotate, nil, nil, false) - letSleep = false - end - - if distance < Config.Marker.x then - isInMarker, currentHospital, currentPart, currentPartNum = true, hospitalNum, 'AmbulanceActions', k - end - end - - -- Pharmacies - for k,v in ipairs(hospital.Pharmacies) do - local distance = GetDistanceBetweenCoords(playerCoords, v, true) - - if distance < Config.DrawDistance then - DrawMarker(Config.Marker.type, v, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Config.Marker.x, Config.Marker.y, Config.Marker.z, Config.Marker.r, Config.Marker.g, Config.Marker.b, Config.Marker.a, false, false, 2, Config.Marker.rotate, nil, nil, false) - letSleep = false - end - - if distance < Config.Marker.x then - isInMarker, currentHospital, currentPart, currentPartNum = true, hospitalNum, 'Pharmacy', k - end - end - - -- Vehicle Spawners - for k,v in ipairs(hospital.Vehicles) do - local distance = GetDistanceBetweenCoords(playerCoords, v.Spawner, true) - - if distance < Config.DrawDistance then - DrawMarker(v.Marker.type, v.Spawner, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, v.Marker.x, v.Marker.y, v.Marker.z, v.Marker.r, v.Marker.g, v.Marker.b, v.Marker.a, false, false, 2, v.Marker.rotate, nil, nil, false) - letSleep = false - end - - if distance < v.Marker.x then - isInMarker, currentHospital, currentPart, currentPartNum = true, hospitalNum, 'Vehicles', k - end - end - - -- Helicopter Spawners - for k,v in ipairs(hospital.Helicopters) do - local distance = GetDistanceBetweenCoords(playerCoords, v.Spawner, true) - - if distance < Config.DrawDistance then - DrawMarker(v.Marker.type, v.Spawner, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, v.Marker.x, v.Marker.y, v.Marker.z, v.Marker.r, v.Marker.g, v.Marker.b, v.Marker.a, false, false, 2, v.Marker.rotate, nil, nil, false) - letSleep = false - end - - if distance < v.Marker.x then - isInMarker, currentHospital, currentPart, currentPartNum = true, hospitalNum, 'Helicopters', k - end - end - - -- Fast Travels - for k,v in ipairs(hospital.FastTravels) do - local distance = GetDistanceBetweenCoords(playerCoords, v.From, true) - - if distance < Config.DrawDistance then - DrawMarker(v.Marker.type, v.From, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, v.Marker.x, v.Marker.y, v.Marker.z, v.Marker.r, v.Marker.g, v.Marker.b, v.Marker.a, false, false, 2, v.Marker.rotate, nil, nil, false) - letSleep = false - end - - - if distance < v.Marker.x then - FastTravel(v.To.coords, v.To.heading) - end - end - - -- Fast Travels (Prompt) - for k,v in ipairs(hospital.FastTravelsPrompt) do - local distance = GetDistanceBetweenCoords(playerCoords, v.From, true) - - if distance < Config.DrawDistance then - DrawMarker(v.Marker.type, v.From, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, v.Marker.x, v.Marker.y, v.Marker.z, v.Marker.r, v.Marker.g, v.Marker.b, v.Marker.a, false, false, 2, v.Marker.rotate, nil, nil, false) - letSleep = false - end - - if distance < v.Marker.x then - isInMarker, currentHospital, currentPart, currentPartNum = true, hospitalNum, 'FastTravelsPrompt', k - end - end - - end - - -- Logic for exiting & entering markers - if isInMarker and not HasAlreadyEnteredMarker or (isInMarker and (LastHospital ~= currentHospital or LastPart ~= currentPart or LastPartNum ~= currentPartNum)) then - - if - (LastHospital ~= nil and LastPart ~= nil and LastPartNum ~= nil) and - (LastHospital ~= currentHospital or LastPart ~= currentPart or LastPartNum ~= currentPartNum) - then - TriggerEvent('esx_ambulancejob:hasExitedMarker', LastHospital, LastPart, LastPartNum) - hasExited = true - end - - HasAlreadyEnteredMarker, LastHospital, LastPart, LastPartNum = true, currentHospital, currentPart, currentPartNum - - TriggerEvent('esx_ambulancejob:hasEnteredMarker', currentHospital, currentPart, currentPartNum) - - end - - if not hasExited and not isInMarker and HasAlreadyEnteredMarker then - HasAlreadyEnteredMarker = false - TriggerEvent('esx_ambulancejob:hasExitedMarker', LastHospital, LastPart, LastPartNum) - end - - if letSleep then - Citizen.Wait(500) - end - end -end) - -AddEventHandler('esx_ambulancejob:hasEnteredMarker', function(hospital, part, partNum) - if ESX.PlayerData.job and ESX.PlayerData.job.name == 'ambulance' then - if part == 'AmbulanceActions' then - CurrentAction = part - CurrentActionMsg = _U('actions_prompt') - CurrentActionData = {} - elseif part == 'Pharmacy' then - CurrentAction = part - CurrentActionMsg = _U('open_pharmacy') - CurrentActionData = {} - elseif part == 'Vehicles' then - CurrentAction = part - CurrentActionMsg = _U('garage_prompt') - CurrentActionData = {hospital = hospital, partNum = partNum} - elseif part == 'Helicopters' then - CurrentAction = part - CurrentActionMsg = _U('helicopter_prompt') - CurrentActionData = {hospital = hospital, partNum = partNum} - elseif part == 'FastTravelsPrompt' then - local travelItem = Config.Hospitals[hospital][part][partNum] - - CurrentAction = part - CurrentActionMsg = travelItem.Prompt - CurrentActionData = {to = travelItem.To.coords, heading = travelItem.To.heading} - end - end -end) - -AddEventHandler('esx_ambulancejob:hasExitedMarker', function(hospital, part, partNum) - if not isInShopMenu then - ESX.UI.Menu.CloseAll() - end - - CurrentAction = nil -end) - --- Key Controls -Citizen.CreateThread(function() - while true do - Citizen.Wait(0) - - if CurrentAction then - ESX.ShowHelpNotification(CurrentActionMsg) - - if IsControlJustReleased(0, Keys['E']) then - - if CurrentAction == 'AmbulanceActions' then - OpenAmbulanceActionsMenu() - elseif CurrentAction == 'Pharmacy' then - OpenPharmacyMenu() - elseif CurrentAction == 'Vehicles' then - OpenVehicleSpawnerMenu(CurrentActionData.hospital, CurrentActionData.partNum) - elseif CurrentAction == 'Helicopters' then - OpenHelicopterSpawnerMenu(CurrentActionData.hospital, CurrentActionData.partNum) - elseif CurrentAction == 'FastTravelsPrompt' then - FastTravel(CurrentActionData.to, CurrentActionData.heading) - end - - CurrentAction = nil - - end - - elseif ESX.PlayerData.job ~= nil and ESX.PlayerData.job.name == 'ambulance' and not IsDead then - if IsControlJustReleased(0, Keys['F6']) then - OpenMobileAmbulanceActionsMenu() - end - else - Citizen.Wait(500) - end - end -end) - -RegisterNetEvent('esx_ambulancejob:putInVehicle') -AddEventHandler('esx_ambulancejob:putInVehicle', function() - local playerPed = PlayerPedId() - local coords = GetEntityCoords(playerPed) - - if IsAnyVehicleNearPoint(coords, 5.0) then - local vehicle = GetClosestVehicle(coords, 5.0, 0, 71) - - if DoesEntityExist(vehicle) then - local maxSeats, freeSeat = GetVehicleMaxNumberOfPassengers(vehicle) - - for i=maxSeats - 1, 0, -1 do - if IsVehicleSeatFree(vehicle, i) then - freeSeat = i - break - end - end - - if freeSeat then - TaskWarpPedIntoVehicle(playerPed, vehicle, freeSeat) - end - end - end -end) - -function OpenCloakroomMenu() - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'cloakroom', { - title = _U('cloakroom'), - align = 'top-left', - elements = { - {label = _U('ems_clothes_civil'), value = 'citizen_wear'}, - {label = _U('ems_clothes_ems'), value = 'ambulance_wear'}, - } - }, function(data, menu) - if data.current.value == 'citizen_wear' then - ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin) - TriggerEvent('skinchanger:loadSkin', skin) - end) - elseif data.current.value == 'ambulance_wear' then - ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin) - if skin.sex == 0 then - TriggerEvent('skinchanger:loadClothes', skin, jobSkin.skin_male) - else - TriggerEvent('skinchanger:loadClothes', skin, jobSkin.skin_female) - end - end) - end - - menu.close() - end, function(data, menu) - menu.close() - end) -end - -function OpenVehicleSpawnerMenu(hospital, partNum) - local playerCoords = GetEntityCoords(PlayerPedId()) - local elements = { - {label = _U('garage_storeditem'), action = 'garage'}, - {label = _U('garage_storeitem'), action = 'store_garage'}, - {label = _U('garage_buyitem'), action = 'buy_vehicle'} - } - - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle', { - title = _U('garage_title'), - align = 'top-left', - elements = elements - }, function(data, menu) - - if data.current.action == 'buy_vehicle' then - local shopCoords = Config.Hospitals[hospital].Vehicles[partNum].InsideShop - local shopElements = {} - - local authorizedVehicles = Config.AuthorizedVehicles[ESX.PlayerData.job.grade_name] - - if #authorizedVehicles > 0 then - for k,vehicle in ipairs(authorizedVehicles) do - table.insert(shopElements, { - label = ('%s - %s'):format(vehicle.label, _U('shop_item', ESX.Math.GroupDigits(vehicle.price))), - name = vehicle.label, - model = vehicle.model, - price = vehicle.price, - type = 'car' - }) - end - else - return - end - - OpenShopMenu(shopElements, playerCoords, shopCoords) - elseif data.current.action == 'garage' then - local garage = {} - - ESX.TriggerServerCallback('esx_vehicleshop:retrieveJobVehicles', function(jobVehicles) - if #jobVehicles > 0 then - for k,v in ipairs(jobVehicles) do - local props = json.decode(v.vehicle) - local vehicleName = GetLabelText(GetDisplayNameFromVehicleModel(props.model)) - local label = ('%s - %s: '):format(vehicleName, props.plate) - - if v.stored then - label = label .. ('%s'):format(_U('garage_stored')) - else - label = label .. ('%s'):format(_U('garage_notstored')) - end - - table.insert(garage, { - label = label, - stored = v.stored, - model = props.model, - vehicleProps = props - }) - end - - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle_garage', { - title = _U('garage_title'), - align = 'top-left', - elements = garage - }, function(data2, menu2) - if data2.current.stored then - local foundSpawn, spawnPoint = GetAvailableVehicleSpawnPoint(hospital, 'Vehicles', partNum) - - if foundSpawn then - menu2.close() - - ESX.Game.SpawnVehicle(data2.current.model, spawnPoint.coords, spawnPoint.heading, function(vehicle) - ESX.Game.SetVehicleProperties(vehicle, data2.current.vehicleProps) - - TriggerServerEvent('esx_vehicleshop:setJobVehicleState', data2.current.vehicleProps.plate, false) - ESX.ShowNotification(_U('garage_released')) - end) - end - else - ESX.ShowNotification(_U('garage_notavailable')) - end - end, function(data2, menu2) - menu2.close() - end) - - else - ESX.ShowNotification(_U('garage_empty')) - end - end, 'car') - - elseif data.current.action == 'store_garage' then - StoreNearbyVehicle(playerCoords) - end - - end, function(data, menu) - menu.close() - end) - -end - -function StoreNearbyVehicle(playerCoords) - local vehicles, vehiclePlates = ESX.Game.GetVehiclesInArea(playerCoords, 30.0), {} - - if #vehicles > 0 then - for k,v in ipairs(vehicles) do - - -- Make sure the vehicle we're saving is empty, or else it wont be deleted - if GetVehicleNumberOfPassengers(v) == 0 and IsVehicleSeatFree(v, -1) then - table.insert(vehiclePlates, { - vehicle = v, - plate = ESX.Math.Trim(GetVehicleNumberPlateText(v)) - }) - end - end - else - ESX.ShowNotification(_U('garage_store_nearby')) - return - end - - ESX.TriggerServerCallback('esx_ambulancejob:storeNearbyVehicle', function(storeSuccess, foundNum) - if storeSuccess then - local vehicleId = vehiclePlates[foundNum] - local attempts = 0 - ESX.Game.DeleteVehicle(vehicleId.vehicle) - IsBusy = true - - Citizen.CreateThread(function() - while IsBusy do - Citizen.Wait(0) - drawLoadingText(_U('garage_storing'), 255, 255, 255, 255) - end - end) - - -- Workaround for vehicle not deleting when other players are near it. - while DoesEntityExist(vehicleId.vehicle) do - Citizen.Wait(500) - attempts = attempts + 1 - - -- Give up - if attempts > 30 then - break - end - - vehicles = ESX.Game.GetVehiclesInArea(playerCoords, 30.0) - if #vehicles > 0 then - for k,v in ipairs(vehicles) do - if ESX.Math.Trim(GetVehicleNumberPlateText(v)) == vehicleId.plate then - ESX.Game.DeleteVehicle(v) - break - end - end - end - end - - IsBusy = false - ESX.ShowNotification(_U('garage_has_stored')) - else - ESX.ShowNotification(_U('garage_has_notstored')) - end - end, vehiclePlates) -end - -function GetAvailableVehicleSpawnPoint(hospital, part, partNum) - local spawnPoints = Config.Hospitals[hospital][part][partNum].SpawnPoints - local found, foundSpawnPoint = false, nil - - for i=1, #spawnPoints, 1 do - if ESX.Game.IsSpawnPointClear(spawnPoints[i].coords, spawnPoints[i].radius) then - found, foundSpawnPoint = true, spawnPoints[i] - break - end - end - - if found then - return true, foundSpawnPoint - else - ESX.ShowNotification(_U('garage_blocked')) - return false - end -end - -function OpenHelicopterSpawnerMenu(hospital, partNum) - local playerCoords = GetEntityCoords(PlayerPedId()) - ESX.PlayerData = ESX.GetPlayerData() - local elements = { - {label = _U('helicopter_garage'), action = 'garage'}, - {label = _U('helicopter_store'), action = 'store_garage'}, - {label = _U('helicopter_buy'), action = 'buy_helicopter'} - } - - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'helicopter_spawner', { - title = _U('helicopter_title'), - align = 'top-left', - elements = elements - }, function(data, menu) - - if data.current.action == 'buy_helicopter' then - local shopCoords = Config.Hospitals[hospital].Helicopters[partNum].InsideShop - local shopElements = {} - - local authorizedHelicopters = Config.AuthorizedHelicopters[ESX.PlayerData.job.grade_name] - - if #authorizedHelicopters > 0 then - for k,helicopter in ipairs(authorizedHelicopters) do - table.insert(shopElements, { - label = ('%s - %s'):format(helicopter.label, _U('shop_item', ESX.Math.GroupDigits(helicopter.price))), - name = helicopter.label, - model = helicopter.model, - price = helicopter.price, - type = 'helicopter' - }) - end - else - ESX.ShowNotification(_U('helicopter_notauthorized')) - return - end - - OpenShopMenu(shopElements, playerCoords, shopCoords) - elseif data.current.action == 'garage' then - local garage = {} - - ESX.TriggerServerCallback('esx_vehicleshop:retrieveJobVehicles', function(jobVehicles) - if #jobVehicles > 0 then - for k,v in ipairs(jobVehicles) do - local props = json.decode(v.vehicle) - local vehicleName = GetLabelText(GetDisplayNameFromVehicleModel(props.model)) - local label = ('%s - %s: '):format(vehicleName, props.plate) - - if v.stored then - label = label .. ('%s'):format(_U('garage_stored')) - else - label = label .. ('%s'):format(_U('garage_notstored')) - end - - table.insert(garage, { - label = label, - stored = v.stored, - model = props.model, - vehicleProps = props - }) - end - - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'helicopter_garage', { - title = _U('helicopter_garage_title'), - align = 'top-left', - elements = garage - }, function(data2, menu2) - if data2.current.stored then - local foundSpawn, spawnPoint = GetAvailableVehicleSpawnPoint(hospital, 'Helicopters', partNum) - - if foundSpawn then - menu2.close() - - ESX.Game.SpawnVehicle(data2.current.model, spawnPoint.coords, spawnPoint.heading, function(vehicle) - ESX.Game.SetVehicleProperties(vehicle, data2.current.vehicleProps) - - TriggerServerEvent('esx_vehicleshop:setJobVehicleState', data2.current.vehicleProps.plate, false) - ESX.ShowNotification(_U('garage_released')) - end) - end - else - ESX.ShowNotification(_U('garage_notavailable')) - end - end, function(data2, menu2) - menu2.close() - end) - - else - ESX.ShowNotification(_U('garage_empty')) - end - end, 'helicopter') - - elseif data.current.action == 'store_garage' then - StoreNearbyVehicle(playerCoords) - end - - end, function(data, menu) - menu.close() - end) - -end - -function OpenShopMenu(elements, restoreCoords, shopCoords) - local playerPed = PlayerPedId() - isInShopMenu = true - - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle_shop', { - title = _U('vehicleshop_title'), - align = 'top-left', - elements = elements - }, function(data, menu) - - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle_shop_confirm', { - title = _U('vehicleshop_confirm', data.current.name, data.current.price), - align = 'top-left', - elements = { - { label = _U('confirm_no'), value = 'no' }, - { label = _U('confirm_yes'), value = 'yes' } - } - }, function(data2, menu2) - - if data2.current.value == 'yes' then - local newPlate = exports['esx_vehicleshop']:GeneratePlate() - local vehicle = GetVehiclePedIsIn(playerPed, false) - local props = ESX.Game.GetVehicleProperties(vehicle) - props.plate = newPlate - - ESX.TriggerServerCallback('esx_ambulancejob:buyJobVehicle', function (bought) - if bought then - ESX.ShowNotification(_U('vehicleshop_bought', data.current.name, ESX.Math.GroupDigits(data.current.price))) - - isInShopMenu = false - ESX.UI.Menu.CloseAll() - - DeleteSpawnedVehicles() - FreezeEntityPosition(playerPed, false) - SetEntityVisible(playerPed, true) - - ESX.Game.Teleport(playerPed, restoreCoords) - else - ESX.ShowNotification(_U('vehicleshop_money')) - menu2.close() - end - end, props, data.current.type) - else - menu2.close() - end - - end, function(data2, menu2) - menu2.close() - end) - - end, function(data, menu) - isInShopMenu = false - ESX.UI.Menu.CloseAll() - - DeleteSpawnedVehicles() - FreezeEntityPosition(playerPed, false) - SetEntityVisible(playerPed, true) - - ESX.Game.Teleport(playerPed, restoreCoords) - end, function(data, menu) - DeleteSpawnedVehicles() - - WaitForVehicleToLoad(data.current.model) - ESX.Game.SpawnLocalVehicle(data.current.model, shopCoords, 0.0, function(vehicle) - table.insert(spawnedVehicles, vehicle) - TaskWarpPedIntoVehicle(playerPed, vehicle, -1) - FreezeEntityPosition(vehicle, true) - end) - end) - - WaitForVehicleToLoad(elements[1].model) - ESX.Game.SpawnLocalVehicle(elements[1].model, shopCoords, 0.0, function(vehicle) - table.insert(spawnedVehicles, vehicle) - TaskWarpPedIntoVehicle(playerPed, vehicle, -1) - FreezeEntityPosition(vehicle, true) - end) -end - -Citizen.CreateThread(function() - while true do - Citizen.Wait(0) - - if isInShopMenu then - DisableControlAction(0, 75, true) -- Disable exit vehicle - DisableControlAction(27, 75, true) -- Disable exit vehicle - else - Citizen.Wait(500) - end - end -end) - -function DeleteSpawnedVehicles() - while #spawnedVehicles > 0 do - local vehicle = spawnedVehicles[1] - ESX.Game.DeleteVehicle(vehicle) - table.remove(spawnedVehicles, 1) - end -end - -function WaitForVehicleToLoad(modelHash) - modelHash = (type(modelHash) == 'number' and modelHash or GetHashKey(modelHash)) - - if not HasModelLoaded(modelHash) then - RequestModel(modelHash) - - while not HasModelLoaded(modelHash) do - Citizen.Wait(0) - - DisableControlAction(0, Keys['TOP'], true) - DisableControlAction(0, Keys['DOWN'], true) - DisableControlAction(0, Keys['LEFT'], true) - DisableControlAction(0, Keys['RIGHT'], true) - DisableControlAction(0, 176, true) -- ENTER key - DisableControlAction(0, Keys['BACKSPACE'], true) - - drawLoadingText(_U('vehicleshop_awaiting_model'), 255, 255, 255, 255) - end - end -end - -function drawLoadingText(text, red, green, blue, alpha) - SetTextFont(4) - SetTextScale(0.0, 0.5) - SetTextColour(red, green, blue, alpha) - SetTextDropshadow(0, 0, 0, 0, 255) - SetTextEdge(1, 0, 0, 0, 255) - SetTextDropShadow() - SetTextOutline() - SetTextCentre(true) - - BeginTextCommandDisplayText("STRING") - AddTextComponentSubstringPlayerName(text) - EndTextCommandDisplayText(0.5, 0.5) -end - -function OpenPharmacyMenu() - ESX.UI.Menu.CloseAll() - - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'pharmacy', { - title = _U('pharmacy_menu_title'), - align = 'top-left', - elements = { - {label = _U('pharmacy_take', _U('medikit')), value = 'medikit'}, - {label = _U('pharmacy_take', _U('bandage')), value = 'bandage'} - } - }, function(data, menu) - TriggerServerEvent('esx_ambulancejob:giveItem', data.current.value) - end, function(data, menu) - menu.close() - end) -end - -function WarpPedInClosestVehicle(ped) - local coords = GetEntityCoords(ped) - - local vehicle, distance = ESX.Game.GetClosestVehicle(coords) - - if distance ~= -1 and distance <= 5.0 then - local maxSeats, freeSeat = GetVehicleMaxNumberOfPassengers(vehicle) - - for i=maxSeats - 1, 0, -1 do - if IsVehicleSeatFree(vehicle, i) then - freeSeat = i - break - end - end - - if freeSeat then - TaskWarpPedIntoVehicle(ped, vehicle, freeSeat) - end - else - ESX.ShowNotification(_U('no_vehicles')) - end -end - -RegisterNetEvent('esx_ambulancejob:heal') -AddEventHandler('esx_ambulancejob:heal', function(healType, quiet) - local playerPed = PlayerPedId() - local maxHealth = GetEntityMaxHealth(playerPed) - - if healType == 'small' then - local health = GetEntityHealth(playerPed) - local newHealth = math.min(maxHealth, math.floor(health + maxHealth / 8)) - SetEntityHealth(playerPed, newHealth) - elseif healType == 'big' then - SetEntityHealth(playerPed, maxHealth) - end - - if not quiet then - ESX.ShowNotification(_U('healed')) - end -end) diff --git a/esx_ambulancejob/client/main.lua b/esx_ambulancejob/client/main.lua deleted file mode 100644 index 6c6f38a9..00000000 --- a/esx_ambulancejob/client/main.lua +++ /dev/null @@ -1,420 +0,0 @@ -Keys = { - ["ESC"] = 322, ["F1"] = 288, ["F2"] = 289, ["F3"] = 170, ["F5"] = 166, ["F6"] = 167, ["F7"] = 168, ["F8"] = 169, ["F9"] = 56, ["F10"] = 57, - ["~"] = 243, ["1"] = 157, ["2"] = 158, ["3"] = 160, ["4"] = 164, ["5"] = 165, ["6"] = 159, ["7"] = 161, ["8"] = 162, ["9"] = 163, ["-"] = 84, ["="] = 83, ["BACKSPACE"] = 177, - ["TAB"] = 37, ["Q"] = 44, ["W"] = 32, ["E"] = 38, ["R"] = 45, ["T"] = 245, ["Y"] = 246, ["U"] = 303, ["P"] = 199, ["["] = 39, ["]"] = 40, ["ENTER"] = 18, - ["CAPS"] = 137, ["A"] = 34, ["S"] = 8, ["D"] = 9, ["F"] = 23, ["G"] = 47, ["H"] = 74, ["K"] = 311, ["L"] = 182, - ["LEFTSHIFT"] = 21, ["Z"] = 20, ["X"] = 73, ["C"] = 26, ["V"] = 0, ["B"] = 29, ["N"] = 249, ["M"] = 244, [","] = 82, ["."] = 81, - ["LEFTCTRL"] = 36, ["LEFTALT"] = 19, ["SPACE"] = 22, ["RIGHTCTRL"] = 70, - ["HOME"] = 213, ["PAGEUP"] = 10, ["PAGEDOWN"] = 11, ["DELETE"] = 178, - ["LEFT"] = 174, ["RIGHT"] = 175, ["TOP"] = 27, ["DOWN"] = 173, - ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 -} - -local FirstSpawn, PlayerLoaded = true, false - -IsDead = false -ESX = nil - -Citizen.CreateThread(function() - while ESX == nil do - TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) - Citizen.Wait(0) - end - - while ESX.GetPlayerData().job == nil do - Citizen.Wait(100) - end - - PlayerLoaded = true - ESX.PlayerData = ESX.GetPlayerData() -end) - -RegisterNetEvent('esx:playerLoaded') -AddEventHandler('esx:playerLoaded', function(xPlayer) - ESX.PlayerData = xPlayer - PlayerLoaded = true -end) - -RegisterNetEvent('esx:setJob') -AddEventHandler('esx:setJob', function(job) - ESX.PlayerData.job = job -end) - ---[[AddEventHandler('playerSpawned', function() - IsDead = false - - if FirstSpawn then - exports.spawnmanager:setAutoSpawn(false) -- disable respawn - FirstSpawn = false - - ESX.TriggerServerCallback('esx_ambulancejob:getDeathStatus', function(isDead) - if isDead and Config.AntiCombatLog then - while not PlayerLoaded do - Citizen.Wait(1000) - end - - ESX.ShowNotification(_U('combatlog_message')) - RemoveItemsAfterRPDeath() - end - end) - end -end)]] - -RegisterNetEvent('esx_ambulancejob:multicharacter') -AddEventHandler('esx_ambulancejob:multicharacter', function() - IsDead = false - - ESX.TriggerServerCallback('esx_ambulancejob:getDeathStatus', function(isDead) - if isDead and Config.AntiCombatLog then - ESX.ShowNotification(_U('combatlog_message')) - RemoveItemsAfterRPDeath() - end - end) -end) - --- Create blips -Citizen.CreateThread(function() - for k,v in pairs(Config.Hospitals) do - local blip = AddBlipForCoord(v.Blip.coords) - - SetBlipSprite(blip, v.Blip.sprite) - SetBlipScale(blip, v.Blip.scale) - SetBlipColour(blip, v.Blip.color) - SetBlipAsShortRange(blip, true) - - BeginTextCommandSetBlipName('STRING') - AddTextComponentSubstringPlayerName(_U('hospital')) - EndTextCommandSetBlipName(blip) - end -end) - --- Disable most inputs when dead -Citizen.CreateThread(function() - while true do - Citizen.Wait(0) - - if IsDead then - DisableAllControlActions(0) - EnableControlAction(0, Keys['G'], true) - EnableControlAction(0, Keys['T'], true) - EnableControlAction(0, Keys['E'], true) - else - Citizen.Wait(500) - end - end -end) - -function OnPlayerDeath() - IsDead = true - ESX.UI.Menu.CloseAll() - TriggerServerEvent('esx_ambulancejob:setDeathStatus', true) - - StartDeathTimer() - StartDistressSignal() - - StartScreenEffect('DeathFailOut', 0, false) -end - -RegisterNetEvent('esx_ambulancejob:useItem') -AddEventHandler('esx_ambulancejob:useItem', function(itemName) - ESX.UI.Menu.CloseAll() - - if itemName == 'medikit' then - local lib, anim = 'anim@heists@narcotics@funding@gang_idle', 'gang_chatting_idle01' -- TODO better animations - local playerPed = PlayerPedId() - - ESX.Streaming.RequestAnimDict(lib, function() - TaskPlayAnim(playerPed, lib, anim, 8.0, -8.0, -1, 0, 0, false, false, false) - - Citizen.Wait(500) - while IsEntityPlayingAnim(playerPed, lib, anim, 3) do - Citizen.Wait(0) - DisableAllControlActions(0) - end - - TriggerEvent('esx_ambulancejob:heal', 'big', true) - ESX.ShowNotification(_U('used_medikit')) - end) - - elseif itemName == 'bandage' then - local lib, anim = 'anim@heists@narcotics@funding@gang_idle', 'gang_chatting_idle01' -- TODO better animations - local playerPed = PlayerPedId() - - ESX.Streaming.RequestAnimDict(lib, function() - TaskPlayAnim(playerPed, lib, anim, 8.0, -8.0, -1, 0, 0, false, false, false) - - Citizen.Wait(500) - while IsEntityPlayingAnim(playerPed, lib, anim, 3) do - Citizen.Wait(0) - DisableAllControlActions(0) - end - - TriggerEvent('esx_ambulancejob:heal', 'small', true) - ESX.ShowNotification(_U('used_bandage')) - end) - end -end) - -function StartDistressSignal() - Citizen.CreateThread(function() - local timer = Config.BleedoutTimer - - while timer > 0 and IsDead do - Citizen.Wait(2) - timer = timer - 30 - - SetTextFont(4) - SetTextScale(0.45, 0.45) - SetTextColour(185, 185, 185, 255) - SetTextDropshadow(0, 0, 0, 0, 255) - SetTextEdge(1, 0, 0, 0, 255) - SetTextDropShadow() - SetTextOutline() - BeginTextCommandDisplayText('STRING') - AddTextComponentSubstringPlayerName(_U('distress_send')) - EndTextCommandDisplayText(0.175, 0.805) - - if IsControlPressed(0, Keys['G']) then - SendDistressSignal() - - Citizen.CreateThread(function() - Citizen.Wait(1000 * 60 * 5) - if IsDead then - StartDistressSignal() - end - end) - - break - end - end - end) -end - -function SendDistressSignal() - local playerPed = PlayerPedId() - PedPosition = GetEntityCoords(playerPed) - - local PlayerCoords = { x = PedPosition.x, y = PedPosition.y, z = PedPosition.z } - - ESX.ShowNotification(_U('distress_sent')) - - TriggerServerEvent('esx_addons_gcphone:startCall', 'ambulance', _U('distress_message'), PlayerCoords, { - - PlayerCoords = { x = PedPosition.x, y = PedPosition.y, z = PedPosition.z }, - }) -end - -function DrawGenericTextThisFrame() - SetTextFont(4) - SetTextScale(0.0, 0.5) - SetTextColour(255, 255, 255, 255) - SetTextDropshadow(0, 0, 0, 0, 255) - SetTextEdge(1, 0, 0, 0, 255) - SetTextDropShadow() - SetTextOutline() - SetTextCentre(true) -end - -function secondsToClock(seconds) - local seconds, hours, mins, secs = tonumber(seconds), 0, 0, 0 - - if seconds <= 0 then - return 0, 0 - else - local hours = string.format("%02.f", math.floor(seconds / 3600)) - local mins = string.format("%02.f", math.floor(seconds / 60 - (hours * 60))) - local secs = string.format("%02.f", math.floor(seconds - hours * 3600 - mins * 60)) - - return mins, secs - end -end - -function StartDeathTimer() - local canPayFine = false - - if Config.EarlyRespawnFine then - ESX.TriggerServerCallback('esx_ambulancejob:checkBalance', function(canPay) - canPayFine = canPay - end) - end - - local earlySpawnTimer = ESX.Math.Round(Config.EarlyRespawnTimer / 1000) - local bleedoutTimer = ESX.Math.Round(Config.BleedoutTimer / 1000) - - Citizen.CreateThread(function() - -- early respawn timer - while earlySpawnTimer > 0 and IsDead do - Citizen.Wait(1000) - - if earlySpawnTimer > 0 then - earlySpawnTimer = earlySpawnTimer - 1 - end - end - - -- bleedout timer - while bleedoutTimer > 0 and IsDead do - Citizen.Wait(1000) - - if bleedoutTimer > 0 then - bleedoutTimer = bleedoutTimer - 1 - end - end - end) - - Citizen.CreateThread(function() - local text, timeHeld - - -- early respawn timer - while earlySpawnTimer > 0 and IsDead do - Citizen.Wait(0) - text = _U('respawn_available_in', secondsToClock(earlySpawnTimer)) - - DrawGenericTextThisFrame() - - SetTextEntry("STRING") - AddTextComponentString(text) - DrawText(0.5, 0.8) - end - - -- bleedout timer - while bleedoutTimer > 0 and IsDead do - Citizen.Wait(0) - text = _U('respawn_bleedout_in', secondsToClock(bleedoutTimer)) - - if not Config.EarlyRespawnFine then - text = text .. _U('respawn_bleedout_prompt') - - if IsControlPressed(0, Keys['E']) and timeHeld > 60 then - RemoveItemsAfterRPDeath() - break - end - elseif Config.EarlyRespawnFine and canPayFine then - text = text .. _U('respawn_bleedout_fine', ESX.Math.GroupDigits(Config.EarlyRespawnFineAmount)) - - if IsControlPressed(0, Keys['E']) and timeHeld > 60 then - TriggerServerEvent('esx_ambulancejob:payFine') - RemoveItemsAfterRPDeath() - break - end - end - - if IsControlPressed(0, Keys['E']) then - timeHeld = timeHeld + 1 - else - timeHeld = 0 - end - - DrawGenericTextThisFrame() - - SetTextEntry("STRING") - AddTextComponentString(text) - DrawText(0.5, 0.8) - end - - if bleedoutTimer < 1 and IsDead then - RemoveItemsAfterRPDeath() - end - end) -end - -function RemoveItemsAfterRPDeath() - TriggerServerEvent('esx_ambulancejob:setDeathStatus', false) - - Citizen.CreateThread(function() - DoScreenFadeOut(800) - - while not IsScreenFadedOut() do - Citizen.Wait(10) - end - - ESX.TriggerServerCallback('esx_ambulancejob:removeItemsAfterRPDeath', function() - local formattedCoords = { - x = Config.RespawnPoint.coords.x, - y = Config.RespawnPoint.coords.y, - z = Config.RespawnPoint.coords.z - } - - ESX.SetPlayerData('lastPosition', formattedCoords) - ESX.SetPlayerData('loadout', {}) - - TriggerServerEvent('esx:updateLastPosition', formattedCoords) - RespawnPed(PlayerPedId(), formattedCoords, Config.RespawnPoint.heading) - - StopScreenEffect('DeathFailOut') - DoScreenFadeIn(800) - end) - end) -end - ---[[function RespawnPed(ped, coords, heading) - SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false, false, true) - NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, heading, true, false) - SetPlayerInvincible(ped, false) - TriggerEvent('playerSpawned', coords.x, coords.y, coords.z) - ClearPedBloodDamage(ped) - - ESX.UI.Menu.CloseAll() -end]] - -function RespawnPed(ped, coords, heading) - SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false, false, true) - NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, heading, true, false) - SetPlayerInvincible(ped, false) - TriggerEvent('esx_ambulancejob:multicharacter', coords.x, coords.y, coords.z) - ClearPedBloodDamage(ped) - - ESX.UI.Menu.CloseAll() -end - -RegisterNetEvent('esx_phone:loaded') -AddEventHandler('esx_phone:loaded', function(phoneNumber, contacts) - local specialContact = { - name = 'Ambulance', - number = 'ambulance', - base64Icon = 'data:image/png;base64,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' - } - - TriggerEvent('esx_phone:addSpecialContact', specialContact.name, specialContact.number, specialContact.base64Icon) -end) - -AddEventHandler('esx:onPlayerDeath', function(data) - OnPlayerDeath() -end) - -RegisterNetEvent('esx_ambulancejob:revive') -AddEventHandler('esx_ambulancejob:revive', function() - local playerPed = PlayerPedId() - local coords = GetEntityCoords(playerPed) - - TriggerServerEvent('esx_ambulancejob:setDeathStatus', false) - - Citizen.CreateThread(function() - DoScreenFadeOut(800) - - while not IsScreenFadedOut() do - Citizen.Wait(50) - end - - local formattedCoords = { - x = ESX.Math.Round(coords.x, 1), - y = ESX.Math.Round(coords.y, 1), - z = ESX.Math.Round(coords.z, 1) - } - - ESX.SetPlayerData('lastPosition', formattedCoords) - - TriggerServerEvent('esx:updateLastPosition', formattedCoords) - - RespawnPed(playerPed, formattedCoords, 0.0) - - StopScreenEffect('DeathFailOut') - DoScreenFadeIn(800) - end) -end) - --- Load unloaded IPLs -if Config.LoadIpl then - Citizen.CreateThread(function() - RequestIpl('Coroner_Int_on') -- Morgue - end) -end diff --git a/esx_ambulancejob/config.lua b/esx_ambulancejob/config.lua deleted file mode 100644 index 4eedd0e7..00000000 --- a/esx_ambulancejob/config.lua +++ /dev/null @@ -1,272 +0,0 @@ -Config = {} - -Config.DrawDistance = 100.0 - -Config.Marker = { type = 21, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 255, b = 102, a = 100, rotate = true } - -Config.ReviveReward = 250 -- revive reward, set to 0 if you don't want it enabled -Config.AntiCombatLog = true -- enable anti-combat logging? -Config.LoadIpl = true -- disable if you're using fivem-ipl or other IPL loaders - -Config.Locale = 'en' - -local second = 1000 -local minute = 60 * second - -Config.EarlyRespawnTimer = 7 * minute -- Time til respawn is available -Config.BleedoutTimer = 10 * minute -- Time til the player bleeds out - -Config.EnablePlayerManagement = true - -Config.RemoveWeaponsAfterRPDeath = true -Config.RemoveCashAfterRPDeath = true -Config.RemoveItemsAfterRPDeath = true - --- Let the player pay for respawning early, only if he can afford it. -Config.EarlyRespawnFine = false -Config.EarlyRespawnFineAmount = 5000 - -Config.RespawnPoint = { coords = vector3(341.0, -1397.3, 32.5), heading = 48.5 } - -Config.Hospitals = { - - CentralLosSantos = { - - Blip = { - coords = vector3(332.86, -1389.43, 32.5), - sprite = 61, - scale = 1.2, - color = 2 - }, - - AmbulanceActions = { - vector3(348.85, -1424.7, 32.94) - }, - - Pharmacies = { - vector3(359.44, -1387.91, 32.43) - }, - - Vehicles = { - { - Spawner = vector3(304.5, -1432.39, 29.93), - InsideShop = vector3(446.7, -1355.6, 43.5), - Marker = { type = 36, x = 1.0, y = 1.0, z = 1.0, r = 100, g = 50, b = 200, a = 100, rotate = true }, - SpawnPoints = { - { coords = vector3(297.2, -1429.5, 29.8), heading = 227.6, radius = 4.0 }, - { coords = vector3(294.0, -1433.1, 29.8), heading = 227.6, radius = 4.0 }, - { coords = vector3(309.4, -1442.5, 29.8), heading = 227.6, radius = 6.0 } - } - } - }, - - Helicopters = { - { - Spawner = vector3(317.5, -1449.5, 46.5), - InsideShop = vector3(305.6, -1419.7, 41.5), - Marker = { type = 34, x = 1.5, y = 1.5, z = 1.5, r = 100, g = 150, b = 150, a = 100, rotate = true }, - SpawnPoints = { - { coords = vector3(313.5, -1465.1, 46.5), heading = 142.7, radius = 10.0 }, - { coords = vector3(299.5, -1453.2, 46.5), heading = 142.7, radius = 10.0 } - } - } - }, - - FastTravels = { - { - From = vector3(315.48, -583.04, 42.31), - To = { coords = vector3(272.8, -1358.8, 23.5), heading = 0.0 }, - Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } - }, - - { - From = vector3(275.3, -1361, 23.5), - To = { coords = vector3(318.37, -584.1, 42.3), heading = 0.0 }, - Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } - }, - - { - From = vector3(332.9, -591.3, 42.31), - To = { coords = vector3(341.4, -584.99, 73.19), heading = 258.5 }, - Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } - }, - - { - From = vector3(338.56, -583.64, 73.22), - To = { coords = vector3(333.6, -589.61, 43.28), heading = 338.38 }, - Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } - }, - - { - From = vector3(298.58, -599.69, 42.4), - To = { coords = vector3(337.67, -594.29, 27.83), heading = 70.88 }, - Marker = { type = 1, x = 1.5, y = 1.5, z = 1.0, r = 102, g = 0, b = 102, a = 100, rotate = false } - }, - - { - From = vector3(340.55, -595.33, 27.8), - To = { coords = vector3(299.35, -597.53, 42.4), heading = 335.43 }, - Marker = { type = 1, x = 1.5, y = 1.5, z = 1.0, r = 102, g = 0, b = 102, a = 100, rotate = false } - } - }, - - FastTravelsPrompt = { - { - From = vector3(237.4, -1373.8, 26.0), - To = { coords = vector3(251.9, -1363.3, 38.5), heading = 0.0 }, - Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false }, - Prompt = _U('fast_travel') - }, - - { - From = vector3(256.5, -1357.7, 36.0), - To = { coords = vector3(235.4, -1372.8, 26.3), heading = 0.0 }, - Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false }, - Prompt = _U('fast_travel') - } - } - - }, - - - HOSPITAL2 = { - - Blip = { - coords = vector3(289.71, -585.82, 42.19), - sprite = 61, - scale = 1.2, - color = 2 - }, - - AmbulanceActions = { - vector3(310.48, -599.23, 43.29) - }, - - Pharmacies = { - vector3(270.5, -1363.22, 24.53) - }, - - Vehicles = { - { - Spawner = vector3(295.27, -600.8, 43.3), - InsideShop = vector3(446.7, -1355.6, 43.5), - Marker = { type = 36, x = 1.0, y = 1.0, z = 1.0, r = 100, g = 50, b = 200, a = 100, rotate = true }, - SpawnPoints = { - { coords = vector3(290.26, -599.41, 43.15), heading = 151.5, radius = 1.0 } - } - } - }, - - Helicopters = { - { - Spawner = vector3(345.46, -580.32, 74.16), - InsideShop = vector3(305.6, -1419.7, 41.5), - Marker = { type = 34, x = 1.5, y = 1.5, z = 1.5, r = 100, g = 150, b = 150, a = 100, rotate = true }, - SpawnPoints = { - { coords = vector3(352.06, -588.03, 74.16), heading = 330.5, radius = 10.0 }, - } - } - }, - - FastTravels = { - { - From = vector3(0, 0, 0.0), - To = { coords = vector3(272.8, -1358.8, 23.5), heading = 0.0 }, - Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } - }, - - { - From = vector3(275.3, -1361, 23.5), - To = { coords = vector3(295.8, -1446.5, 28.9), heading = 0.0 }, - Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } - }, - - { - From = vector3(247.3, -1371.5, 23.5), - To = { coords = vector3(333.1, -1434.9, 45.5), heading = 138.6 }, - Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } - }, - - { - From = vector3(335.5, -1432.0, 45.50), - To = { coords = vector3(249.1, -1369.6, 23.5), heading = 0.0 }, - Marker = { type = 1, x = 2.0, y = 2.0, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false } - }, - - { - From = vector3(234.5, -1373.7, 20.9), - To = { coords = vector3(320.9, -1478.6, 28.8), heading = 0.0 }, - Marker = { type = 1, x = 1.5, y = 1.5, z = 1.0, r = 102, g = 0, b = 102, a = 100, rotate = false } - }, - - { - From = vector3(317.9, -1476.1, 28.9), - To = { coords = vector3(238.6, -1368.4, 23.5), heading = 0.0 }, - Marker = { type = 1, x = 1.5, y = 1.5, z = 1.0, r = 102, g = 0, b = 102, a = 100, rotate = false } - } - }, - - FastTravelsPrompt = { - { - From = vector3(237.4, -1373.8, 26.0), - To = { coords = vector3(251.9, -1363.3, 38.5), heading = 0.0 }, - Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false }, - Prompt = _U('fast_travel') - }, - - { - From = vector3(256.5, -1357.7, 36.0), - To = { coords = vector3(235.4, -1372.8, 26.3), heading = 0.0 }, - Marker = { type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false }, - Prompt = _U('fast_travel') - } - } - - } -} - - -Config.AuthorizedVehicles = { - - ambulance = { - { model = 'ambulance', label = 'Ambulance Van', price = 5000}, - { model = 'dodgesamu', label = 'Dodge Samu', price = 5000} - }, - - doctor = { - { model = 'ambulance', label = 'Ambulance Van', price = 4500}, - { model = 'dodgesamu', label = 'Dodge Samu', price = 5000} - }, - - chief_doctor = { - { model = 'ambulance', label = 'Ambulance Van', price = 3000}, - { model = 'dodgeems', label = 'Dodge EMS', price = 5000} - }, - - boss = { - { model = 'ambulance', label = 'Ambulance Van', price = 2000}, - { model = 'dodgeems', label = 'Dodge EMS', price = 5000} - } - -} - -Config.AuthorizedHelicopters = { - - ambulance = {}, - - doctor = { - { model = 'buzzard2', label = 'Nagasaki Buzzard', price = 20000 }, - { model = 'polmav', label = 'EMS', livery = 1, price = 20000 } - }, - - chief_doctor = { - { model = 'buzzard2', label = 'Nagasaki Buzzard', price = 20000 }, - { model = 'polmav', label = 'EMS', livery = 1, price = 20000 } - }, - - boss = { - { model = 'buzzard2', label = 'Nagasaki Buzzard', price = 20000 }, - { model = 'polmav', label = 'EMS', livery = 1, price = 20000 } - } - -} diff --git a/esx_ambulancejob/esx_ambulancejob.sql b/esx_ambulancejob/esx_ambulancejob.sql deleted file mode 100644 index d88d5676..00000000 --- a/esx_ambulancejob/esx_ambulancejob.sql +++ /dev/null @@ -1,33 +0,0 @@ -USE `essentialmode`; - -INSERT INTO `addon_account` (name, label, shared) VALUES - ('society_ambulance', 'Ambulance', 1) -; - -INSERT INTO `addon_inventory` (name, label, shared) VALUES - ('society_ambulance', 'Ambulance', 1) -; - -INSERT INTO `datastore` (name, label, shared) VALUES - ('society_ambulance', 'Ambulance', 1) -; - -INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES - ('ambulance',0,'ambulance','Ambulancier',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',1,'doctor','Medecin',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',2,'chief_doctor','Medecin-chef',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',3,'boss','Chirurgien',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') -; - -INSERT INTO `jobs` (name, label) VALUES - ('ambulance','Ambulance') -; - -INSERT INTO `items` (name, label, `limit`) VALUES - ('bandage','Bandage', 20), - ('medikit','Medikit', 5) -; - -ALTER TABLE `users` - ADD `is_dead` TINYINT(1) NULL DEFAULT '0' -; diff --git a/esx_ambulancejob/locales/br.lua b/esx_ambulancejob/locales/br.lua deleted file mode 100644 index be0dbc50..00000000 --- a/esx_ambulancejob/locales/br.lua +++ /dev/null @@ -1,90 +0,0 @@ -Locales['br'] = { - -- Cloakroom - ['cloakroom'] = 'Vestiário', - ['ems_clothes_civil'] = 'Roupa Normal', - ['ems_clothes_ems'] = 'Entrar como Socorrista', - -- Vehicles - ['ambulance'] = 'ambulance', - ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', - ['helicopter_buy'] = 'helicopter shop', - ['helicopter_garage'] = 'open garage', - ['helicopter_store'] = 'store helicopter in garage', - ['helicopter_garage_title'] = 'helicopter Garage', - ['helicopter_title'] = 'helicopter Actions', - ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', - ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', - ['garage_title'] = 'vehicle Actions', - ['garage_stored'] = 'stored', - ['garage_notstored'] = 'not in garage', - ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', - ['garage_has_stored'] = 'the vehicle has been stored in your garage', - ['garage_has_notstored'] = 'no nearby owned vehicles were found', - ['garage_notavailable'] = 'your vehicle is not stored in the garage.', - ['garage_blocked'] = 'there\'s no available spawn points!', - ['garage_empty'] = 'you dont have any vehicles in your garage.', - ['garage_released'] = 'your vehicle has been released from the garage.', - ['garage_store_nearby'] = 'there is no nearby vehicles.', - ['garage_storeditem'] = 'open garage', - ['garage_storeitem'] = 'store vehicle in garage', - ['garage_buyitem'] = 'vehicle shop', - ['shop_item'] = '$%s', - ['vehicleshop_title'] = 'vehicle Shop', - ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', - ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', - ['vehicleshop_money'] = 'you cannot afford that vehicle', - ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', - ['confirm_no'] = 'no', - ['confirm_yes'] = 'yes', - -- Action Menu - ['hospital'] = 'Hôspital', - ['revive_inprogress'] = 'Reanimação em andamento', - ['revive_complete'] = 'você ressuscitou ~y~%s~s~', - ['revive_complete_award'] = 'você ressuscitou ~y~%s~s~, ~g~$%s~s~', - ['heal_inprogress'] = 'you are healing!', - ['heal_complete'] = 'you have healed ~y~%s~s~', - ['no_players'] = 'Nenhum jogador nas proximidades', - ['no_vehicles'] = 'Sem veículos nas proximidades', - ['player_not_unconscious'] = 'Não está inconsciente', - ['player_not_conscious'] = 'that player is not conscious!', - -- Boss Menu - ['boss_actions'] = 'Menu Administração', - -- Misc - ['invalid_amount'] = '~r~Quantidade inválida', - ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', - ['deposit_amount'] = 'Quantidade inválida para deposito', - ['money_withdraw'] = 'Quantidade a ser retirada', - ['fast_travel'] = 'Aperte ~INPUT_CONTEXT~ para mover-se rapidamente.', - ['open_pharmacy'] = 'Aperte ~INPUT_CONTEXT~ para abrir a farmácia.', - ['pharmacy_menu_title'] = 'Farmácia', - ['pharmacy_take'] = 'tomar %s', - ['medikit'] = 'Seringa', - ['bandage'] = 'Vendagem', - ['max_item'] = 'você já carrega o suficiente sobre você.', - -- F6 Menu - ['ems_menu'] = 'Interação com cidadão', - ['ems_menu_title'] = 'Ambulância - Interação com cidadão', - ['ems_menu_revive'] = 'Reanimar', - ['ems_menu_putincar'] = 'Colocar no veiculo', - ['ems_menu_small'] = 'Curar pequenas feridas', - ['ems_menu_big'] = 'Tratando lesões graves', - -- Phone - ['alert_ambulance'] = 'Alerta Socorro', - -- Death - ['respawn_available_in'] = 'respawn available in ~b~%s minutes %s seconds~s~', - ['respawn_bleedout_in'] = 'you will bleed out in ~b~%s minutes %s seconds~s~\n', - ['respawn_bleedout_prompt'] = 'hold [~b~E~s~] to respawn', - ['respawn_bleedout_fine'] = 'hold [~b~E~s~] to respawn for ~g~$%s~s~', - ['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.', - ['distress_send'] = 'press [~b~G~s~] to send distress signal', - ['distress_sent'] = 'distress signal has been sent to available units!', - ['distress_message'] = 'medical attention required: unconscious citizen!', - ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.', - -- Revive - ['revive_help'] = 'reviver um jogador', - -- Item - ['used_medikit'] = 'você usou 1x Seringa', - ['used_bandage'] = 'você usou 1x Vendagem', - ['not_enough_medikit'] = 'Você não tem ~b~Seringa~s~.', - ['not_enough_bandage'] = 'Você não tem ~b~Vendagem~s~.', - ['healed'] = 'Você foi tratado.', -} diff --git a/esx_ambulancejob/locales/cs.lua b/esx_ambulancejob/locales/cs.lua deleted file mode 100644 index 48dc7cc2..00000000 --- a/esx_ambulancejob/locales/cs.lua +++ /dev/null @@ -1,90 +0,0 @@ -Locales['cs'] = { - -- Cloakroom - ['cloakroom'] = 'šatna', - ['ems_clothes_civil'] = 'civilní oblečení', - ['ems_clothes_ems'] = 'zdravotnické oblečení', - -- Vehicles - ['ambulance'] = 'ambulance', - ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', - ['helicopter_buy'] = 'helicopter shop', - ['helicopter_garage'] = 'open garage', - ['helicopter_store'] = 'store helicopter in garage', - ['helicopter_garage_title'] = 'helicopter Garage', - ['helicopter_title'] = 'helicopter Actions', - ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', - ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', - ['garage_title'] = 'vehicle Actions', - ['garage_stored'] = 'stored', - ['garage_notstored'] = 'not in garage', - ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', - ['garage_has_stored'] = 'the vehicle has been stored in your garage', - ['garage_has_notstored'] = 'no nearby owned vehicles were found', - ['garage_notavailable'] = 'your vehicle is not stored in the garage.', - ['garage_blocked'] = 'there\'s no available spawn points!', - ['garage_empty'] = 'you dont have any vehicles in your garage.', - ['garage_released'] = 'your vehicle has been released from the garage.', - ['garage_store_nearby'] = 'there is no nearby vehicles.', - ['garage_storeditem'] = 'open garage', - ['garage_storeitem'] = 'store vehicle in garage', - ['garage_buyitem'] = 'vehicle shop', - ['shop_item'] = '$%s', - ['vehicleshop_title'] = 'vehicle Shop', - ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', - ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', - ['vehicleshop_money'] = 'you cannot afford that vehicle', - ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', - ['confirm_no'] = 'no', - ['confirm_yes'] = 'yes', - -- Action Menu - ['hospital'] = 'nemocnice', - ['revive_inprogress'] = 'probíhá oživení!', - ['revive_complete'] = 'oživili jste ~y~%s~s~', - ['revive_complete_award'] = 'oživili jste ~y~%s~s~ a dostali jste ~g~$%s~s~!', - ['heal_inprogress'] = 'uzdravujete!', - ['heal_complete'] = 'uzdravili jste ~y~%s~s~', - ['no_players'] = 'v okolí není žádný hráč!', - ['no_vehicles'] = 'v okolí není žádné vozidlo', - ['player_not_unconscious'] = 'hráč není v bezvědomí!', - ['player_not_conscious'] = 'hráč je v bezvědomí!', - -- Boss Menu - ['boss_actions'] = 'akce šéfa', - -- Misc - ['invalid_amount'] = '~r~neplatná částka', - ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', - ['deposit_amount'] = 'částka vkladu', - ['money_withdraw'] = 'částka výběru', - ['fast_travel'] = 'stiskněte ~INPUT_CONTEXT~ k rychlému odcestování.', - ['open_pharmacy'] = 'stiskněte ~INPUT_CONTEXT~ k otevření lékárny.', - ['pharmacy_menu_title'] = 'lékárna', - ['pharmacy_take'] = 'vzít ~y~%s~s~', - ['medikit'] = 'lékarnička', - ['bandage'] = 'obvaz', - ['max_item'] = 'již nesete dostatek věcí.', - -- F6 Menu - ['ems_menu'] = 'Zdravotnické menu', - ['ems_menu_title'] = 'záchranka - Zdravotnické menu', - ['ems_menu_revive'] = 'oživit hráče', - ['ems_menu_putincar'] = 'naložit do vozidla', - ['ems_menu_small'] = 'ošetřit malé zranění', - ['ems_menu_big'] = 'ošetřit vážné zranění', - -- Phone - ['alert_ambulance'] = 'zdravotnický poplach', - -- Death - ['respawn_available_in'] = 'oživení dostupné za ~b~%s minut a %s sekund~s~\n', - ['respawn_bleedout_in'] = 'vykrvácíte za ~b~%s minut a %s sekund~s~\n', - ['respawn_bleedout_prompt'] = 'držte [~b~E~s~] pro respawn.', - ['respawn_now_fine'] = 'držte [~b~E~s~] pro oživení za ~g~$%s~s~', - ['respawn_bleedout_fine_msg'] = 'zaplatili jste ~r~$%s~s~ za respawn.', - ['distress_send'] = 'stiskněte [~b~G~s~] pro vyslání tísňového signálu', - ['distress_sent'] = 'tísňový signál byl vyslán dostupným jednotkám!', - ['distress_message'] = 'nutná lékařská péče: občan v bezvědomí!', - ['combatlog_message'] = 'byli jste násilně oživeni, protože jste předtím opustili server, když jste byli mrtví.', - -- Revive - ['revive_help'] = 'oživit hráče', - -- Item - ['used_medikit'] = 'použili jste ~y~1x~s~ lékarničku', - ['used_bandage'] = 'použili jste ~y~1x~s~ obvaz', - ['not_enough_medikit'] = 'nemáte ~b~medikit~s~.', - ['not_enough_bandage'] = 'nemáte~b~bandage~s~.', - ['healed'] = 'byli jste ošetřeni.', -} diff --git a/esx_ambulancejob/locales/en.lua b/esx_ambulancejob/locales/en.lua deleted file mode 100644 index b13f48fe..00000000 --- a/esx_ambulancejob/locales/en.lua +++ /dev/null @@ -1,90 +0,0 @@ -Locales['en'] = { - -- Cloakroom - ['cloakroom'] = 'locker Room', - ['ems_clothes_civil'] = 'civilian Clothes', - ['ems_clothes_ems'] = 'EMS Clothes', - -- Vehicles - ['ambulance'] = 'ambulance', - ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', - ['helicopter_buy'] = 'helicopter shop', - ['helicopter_garage'] = 'open garage', - ['helicopter_store'] = 'store helicopter in garage', - ['helicopter_garage_title'] = 'helicopter Garage', - ['helicopter_title'] = 'helicopter Actions', - ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', - ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', - ['garage_title'] = 'vehicle Actions', - ['garage_stored'] = 'stored', - ['garage_notstored'] = 'not in garage', - ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', - ['garage_has_stored'] = 'the vehicle has been stored in your garage', - ['garage_has_notstored'] = 'no nearby owned vehicles were found', - ['garage_notavailable'] = 'your vehicle is not stored in the garage.', - ['garage_blocked'] = 'there\'s no available spawn points!', - ['garage_empty'] = 'you dont have any vehicles in your garage.', - ['garage_released'] = 'your vehicle has been released from the garage.', - ['garage_store_nearby'] = 'there is no nearby vehicles.', - ['garage_storeditem'] = 'open garage', - ['garage_storeitem'] = 'store vehicle in garage', - ['garage_buyitem'] = 'vehicle shop', - ['shop_item'] = '$%s', - ['vehicleshop_title'] = 'vehicle Shop', - ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', - ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', - ['vehicleshop_money'] = 'you cannot afford that vehicle', - ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', - ['confirm_no'] = 'no', - ['confirm_yes'] = 'yes', - -- Action Menu - ['hospital'] = 'hospital', - ['revive_inprogress'] = 'a revive is in progress!', - ['revive_complete'] = 'you have revived ~y~%s~s~', - ['revive_complete_award'] = 'you have revived ~y~%s~s~ and earned ~g~$%s~s~!', - ['heal_inprogress'] = 'you are healing!', - ['heal_complete'] = 'you have healed ~y~%s~s~', - ['no_players'] = 'no players nearby', - ['no_vehicles'] = 'no vehicles nearby', - ['player_not_unconscious'] = 'that player is not unconscious!', - ['player_not_conscious'] = 'that player is not conscious!', - -- Boss Menu - ['boss_actions'] = 'boss Actions', - -- Misc - ['invalid_amount'] = '~r~Invalid amount', - ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', - ['deposit_amount'] = 'deposit Amount', - ['money_withdraw'] = 'amount withdrawn', - ['fast_travel'] = 'press ~INPUT_CONTEXT~ to fast travel.', - ['open_pharmacy'] = 'press ~INPUT_CONTEXT~ to open the pharmacy.', - ['pharmacy_menu_title'] = 'pharmacy', - ['pharmacy_take'] = 'take %s', - ['medikit'] = 'medikit', - ['bandage'] = 'bandage', - ['max_item'] = 'You are already carrying enough.', - -- F6 Menu - ['ems_menu'] = 'EMS Menu', - ['ems_menu_title'] = 'ambulance - EMS Menu', - ['ems_menu_revive'] = 'revive Player', - ['ems_menu_putincar'] = 'put in Vehicle', - ['ems_menu_small'] = 'heal small wounds', - ['ems_menu_big'] = 'treat serious injuries', - -- Phone - ['alert_ambulance'] = 'alert Ambulance', - -- Death - ['respawn_available_in'] = 'respawn available in ~b~%s minutes %s seconds~s~', - ['respawn_bleedout_in'] = 'you will bleed out in ~b~%s minutes %s seconds~s~\n', - ['respawn_bleedout_prompt'] = 'hold [~b~E~s~] to respawn', - ['respawn_bleedout_fine'] = 'hold [~b~E~s~] to respawn for ~g~$%s~s~', - ['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.', - ['distress_send'] = 'press [~b~G~s~] to send distress signal', - ['distress_sent'] = 'distress signal has been sent to available units!', - ['distress_message'] = 'medical attention required: unconscious citizen!', - ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.', - -- Revive - ['revive_help'] = 'revive a player', - -- Item - ['used_medikit'] = 'You have used ~y~1x~s~ medikit', - ['used_bandage'] = 'You have used ~y~1x~s~ bandage', - ['not_enough_medikit'] = 'You do not have ~b~medikit~s~.', - ['not_enough_bandage'] = 'You do not have ~b~bandage~s~.', - ['healed'] = 'you have been treated.', -} diff --git a/esx_ambulancejob/locales/es.lua b/esx_ambulancejob/locales/es.lua deleted file mode 100644 index 5b1e4ecb..00000000 --- a/esx_ambulancejob/locales/es.lua +++ /dev/null @@ -1,90 +0,0 @@ -Locales['es'] = { - -- Cloakroom - ['cloakroom'] = 'Guardarropa', - ['ems_clothes_civil'] = 'Camiseta', - ['ems_clothes_ems'] = 'Equipo de ambulancia', - -- Vehicles - ['ambulance'] = 'ambulance', - ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', - ['helicopter_buy'] = 'helicopter shop', - ['helicopter_garage'] = 'open garage', - ['helicopter_store'] = 'store helicopter in garage', - ['helicopter_garage_title'] = 'helicopter Garage', - ['helicopter_title'] = 'helicopter Actions', - ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', - ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', - ['garage_title'] = 'vehicle Actions', - ['garage_stored'] = 'stored', - ['garage_notstored'] = 'not in garage', - ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', - ['garage_has_stored'] = 'the vehicle has been stored in your garage', - ['garage_has_notstored'] = 'no nearby owned vehicles were found', - ['garage_notavailable'] = 'your vehicle is not stored in the garage.', - ['garage_blocked'] = 'there\'s no available spawn points!', - ['garage_empty'] = 'you dont have any vehicles in your garage.', - ['garage_released'] = 'your vehicle has been released from the garage.', - ['garage_store_nearby'] = 'there is no nearby vehicles.', - ['garage_storeditem'] = 'open garage', - ['garage_storeitem'] = 'store vehicle in garage', - ['garage_buyitem'] = 'vehicle shop', - ['shop_item'] = '$%s', - ['vehicleshop_title'] = 'vehicle Shop', - ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', - ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', - ['vehicleshop_money'] = 'you cannot afford that vehicle', - ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', - ['confirm_no'] = 'no', - ['confirm_yes'] = 'yes', - -- Action Menu - ['hospital'] = 'hospital', - ['revive_inprogress'] = 'reanimación en curso', - ['revive_complete'] = 'has sido reanimado ~y~%s~s~', - ['revive_complete_award'] = 'has sido reanimado ~y~%s~s~, ~g~$%s~s~', - ['heal_inprogress'] = 'you are healing!', - ['heal_complete'] = 'you have healed ~y~%s~s~', - ['no_players'] = 'ningún jugador cerca', - ['no_vehicles'] = 'ningún vehículo cerca', - ['player_not_unconscious'] = 'n\'estás inconsciente', - ['player_not_conscious'] = 'that player is not conscious!', - -- Boss Menu - ['boss_actions'] = 'boss Actions', - -- Misc - ['invalid_amount'] = '~r~cantidad no válida', - ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', - ['deposit_amount'] = 'cantidad de fianza depositada', - ['money_withdraw'] = 'cantidad de fianza retirada', - ['fast_travel'] = 'Press ~INPUT_CONTEXT~ to fast travel.', - ['open_pharmacy'] = 'Press ~INPUT_CONTEXT~ to open the pharmacy.', - ['pharmacy_menu_title'] = 'Pharmacy', - ['pharmacy_take'] = 'take %s', - ['medikit'] = 'medikit', - ['bandage'] = 'bandage', - ['max_item'] = 'You are already carrying enough on yourself.', - -- F6 Menu - ['ems_menu'] = 'ayuda ciudadana', - ['ems_menu_title'] = 'ambulancia - Ayuda Ciudadana', - ['ems_menu_revive'] = 'reanimar', - ['ems_menu_putincar'] = 'meter en el vehículo', - ['ems_menu_small'] = 'heal small wounds', - ['ems_menu_big'] = 'treat serious injuries', - -- Phone - ['alert_ambulance'] = 'Alerta de ambulancia', - -- Death - ['respawn_available_in'] = 'respawn available in ~b~%s minutes %s seconds~s~', - ['respawn_bleedout_in'] = 'you will bleed out in ~b~%s minutes %s seconds~s~\n', - ['respawn_bleedout_prompt'] = 'hold [~b~E~s~] to respawn', - ['respawn_bleedout_fine'] = 'hold [~b~E~s~] to respawn for ~g~$%s~s~', - ['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.', - ['distress_send'] = 'press [~b~G~s~] to send distress signal', - ['distress_sent'] = 'distress signal has been sent to available units!', - ['distress_message'] = 'medical attention required: unconscious citizen!', - ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.', - -- Revive - ['revive_help'] = 'reviver un jugador', - -- Item - ['used_medikit'] = 'You have used ~y~1x~s~ medikit', - ['used_bandage'] = 'You have used ~y~1x~s~ bandage', - ['not_enough_medikit'] = 'You do not have ~b~medikit~s~.', - ['not_enough_bandage'] = 'You do not have ~b~bandage~s~.', - ['healed'] = 'you have been treated.', -} diff --git a/esx_ambulancejob/locales/fi.lua b/esx_ambulancejob/locales/fi.lua deleted file mode 100644 index ac99fc65..00000000 --- a/esx_ambulancejob/locales/fi.lua +++ /dev/null @@ -1,90 +0,0 @@ -Locales['fi'] = { - -- Cloakroom - ['cloakroom'] = 'Vaatelokero', - ['ems_clothes_civil'] = 'Siviilikamppeet', - ['ems_clothes_ems'] = 'Työkamppeet', - -- Vehicles - ['ambulance'] = 'ambulance', - ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', - ['helicopter_buy'] = 'helicopter shop', - ['helicopter_garage'] = 'open garage', - ['helicopter_store'] = 'store helicopter in garage', - ['helicopter_garage_title'] = 'helicopter Garage', - ['helicopter_title'] = 'helicopter Actions', - ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', - ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', - ['garage_title'] = 'vehicle Actions', - ['garage_stored'] = 'stored', - ['garage_notstored'] = 'not in garage', - ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', - ['garage_has_stored'] = 'the vehicle has been stored in your garage', - ['garage_has_notstored'] = 'no nearby owned vehicles were found', - ['garage_notavailable'] = 'your vehicle is not stored in the garage.', - ['garage_blocked'] = 'there\'s no available spawn points!', - ['garage_empty'] = 'you dont have any vehicles in your garage.', - ['garage_released'] = 'your vehicle has been released from the garage.', - ['garage_store_nearby'] = 'there is no nearby vehicles.', - ['garage_storeditem'] = 'open garage', - ['garage_storeitem'] = 'store vehicle in garage', - ['garage_buyitem'] = 'vehicle shop', - ['shop_item'] = '$%s', - ['vehicleshop_title'] = 'vehicle Shop', - ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', - ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', - ['vehicleshop_money'] = 'you cannot afford that vehicle', - ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', - ['confirm_no'] = 'no', - ['confirm_yes'] = 'yes', - -- Action Menu - ['hospital'] = 'sairaala', - ['revive_inprogress'] = 'elvytys on menossa!', - ['revive_complete'] = 'sinä elvytit henkilön ~y~%s~s~', - ['revive_complete_award'] = 'sinä elvytit henkilön ~y~%s~s~ ja tienasit ~g~$%s~s~!', - ['heal_inprogress'] = 'sinä olet parantamassa!', - ['heal_complete'] = 'sinä paransit henkilön ~y~%s~s~', - ['no_players'] = 'ei pelaajia lähettyvillä', - ['no_vehicles'] = 'ei ajoneuvoja lähettyvillä', - ['player_not_unconscious'] = 'tämä pelaaja ei ole tajuton!', - ['player_not_conscious'] = 'tämä pelaaja ei ole tajuissaan!', - -- Boss Menu - ['boss_actions'] = 'pomovalikko', - -- Misc - ['invalid_amount'] = '~r~Virheellinen summa', - ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', - ['deposit_amount'] = 'talletettava summa', - ['money_withdraw'] = 'nostettava summa', - ['fast_travel'] = 'paina ~INPUT_CONTEXT~ liikkuaksesi nopeasti kerrosten välillä', - ['open_pharmacy'] = 'paina ~INPUT_CONTEXT~ avataksesi lääkekaappi', - ['pharmacy_menu_title'] = 'lääkekaappi', - ['pharmacy_take'] = 'ota %s', - ['medikit'] = 'ensiapupakkauksia', - ['bandage'] = 'sideharsoja', - ['max_item'] = 'sinulla on jo tarpeeksi mukana', - -- F6 Menu - ['ems_menu'] = 'ensihoito menu', - ['ems_menu_title'] = 'ensihoito - Siviilin kanssakäyminen', - ['ems_menu_revive'] = 'elvytä', - ['ems_menu_putincar'] = 'Laita ajoneuvoon', - ['ems_menu_small'] = 'hoida pieniä haavoja', - ['ems_menu_big'] = 'hoida isoja haavoja', - -- Phone - ['alert_ambulance'] = 'hälyytys Ensihoidolle', - -- Death - ['respawn_available_in'] = 'respawn available in ~b~%s minutes %s seconds~s~', - ['respawn_bleedout_in'] = 'you will bleed out in ~b~%s minutes %s seconds~s~\n', - ['respawn_bleedout_prompt'] = 'hold [~b~E~s~] to respawn', - ['respawn_bleedout_fine'] = 'hold [~b~E~s~] to respawn for ~g~$%s~s~', - ['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.', - ['distress_send'] = 'press [~b~G~s~] to send distress signal', - ['distress_sent'] = 'distress signal has been sent to available units!', - ['distress_message'] = 'medical attention required: unconscious citizen!', - ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.', - -- Revive - ['revive_help'] = 'elvytä pelaaja', - -- Item - ['used_medikit'] = 'sinä käytit ensiapupakkauksen', - ['used_bandage'] = 'sinä käytit sideharsoja', - ['not_enough_medikit'] = 'ei tarpeeksi ~b~ensiapupakkauksia~s~.', - ['not_enough_bandage'] = 'ei tarpeeksi ~b~sideharsoja~s~.', - ['healed'] = 'sinua parannettiin', -} diff --git a/esx_ambulancejob/locales/fr.lua b/esx_ambulancejob/locales/fr.lua deleted file mode 100644 index b56c17f7..00000000 --- a/esx_ambulancejob/locales/fr.lua +++ /dev/null @@ -1,90 +0,0 @@ -Locales['fr'] = { - -- Cloakroom - ['cloakroom'] = 'Vestiaire', - ['ems_clothes_civil'] = 'Tenue Civil', - ['ems_clothes_ems'] = 'Tenue Ambulancier', - -- Vehicles - ['ambulance'] = 'ambulance', - ['helicopter_prompt'] = 'appuyez sur ~INPUT_CONTEXT~ pour accéder aux ~y~Actions de l\'hélicoptère~s~.', - ['helicopter_buy'] = 'magasin hélicoptère', - ['helicopter_garage'] = 'ouvrir le garage', - ['helicopter_store'] = 'garer l\'hélicoptère dans le garage', - ['helicopter_garage_title'] = 'garage hélicoptère', - ['helicopter_title'] = 'actions hélicoptère', - ['helicopter_notauthorized'] = 'vous n\'êtes pas autorisé à acheter un hélicoptère.', - ['garage_prompt'] = 'appuyez sur ~INPUT_CONTEXT~ pour accéder aux ~y~Actions des véhciules~s~.', - ['garage_title'] = 'actions véhicules', - ['garage_stored'] = 'rangé', - ['garage_notstored'] = 'en dehors du garage', - ['garage_storing'] = 'tentative de suppression du véhicule, assurez-vous que personne ne soit autour.', - ['garage_has_stored'] = 'le véhicule a bien été rangé dans le garage', - ['garage_has_notstored'] = 'aucun véhicule dans le garage', - ['garage_notavailable'] = 'votre véhicule n\'est pas rangé dans le garage.', - ['garage_blocked'] = 'la sortie du garage est obstruée!', - ['garage_empty'] = 'vous n\'avez aucun véhicule dans le garage.', - ['garage_released'] = 'votre véhicule a été sorti.', - ['garage_store_nearby'] = 'aucun véhicule a proximité.', - ['garage_storeditem'] = 'ouvrir le garage', - ['garage_storeitem'] = 'ranger le véhicule', - ['garage_buyitem'] = 'magasin véhicule', - ['shop_item'] = '$%s', - ['vehicleshop_title'] = 'magasin véhicule', - ['vehicleshop_confirm'] = 'voulez-vous acheter ce véhicule?', - ['vehicleshop_bought'] = 'vous avez acheté ~y~%s~s~ pour ~r~$%s~s~', - ['vehicleshop_money'] = 'vous ne pouvez pas acheter ce véhicule', - ['vehicleshop_awaiting_model'] = 'le véhicule est actuellement en ~g~PRÉPARATION~s~ veuillez patienter', - ['confirm_no'] = 'non', - ['confirm_yes'] = 'oui', - -- Action Menu - ['hospital'] = 'hôpital', - ['revive_inprogress'] = 'réanimation en cours', - ['revive_complete'] = 'vous avez réanimé ~y~%s~s~', - ['revive_complete_award'] = 'vous avez réanimé ~y~%s~s~, ~g~$%s~s~', - ['heal_inprogress'] = 'vous soignez...', - ['heal_complete'] = 'vous avez soigné ~y~%s~s~', - ['no_players'] = 'aucun joueur à proximité', - ['no_vehicles'] = 'aucun véhicule à proximité', - ['player_not_unconscious'] = 'n\'est pas inconscient', - ['player_not_conscious'] = 'Cette personne est inconsciente!', - -- Boss Menu - ['boss_actions'] = 'action Patron', - -- Misc - ['invalid_amount'] = '~r~montant invalide', - ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', - ['deposit_amount'] = 'montant du dépôt', - ['money_withdraw'] = 'montant du retrait', - ['fast_travel'] = 'appuyez sur ~INPUT_CONTEXT~ pour vous déplacer rapidement.', - ['open_pharmacy'] = 'appuyez sur ~INPUT_CONTEXT~ pour ouvrir la pharmacie.', - ['pharmacy_menu_title'] = 'Pharmacie', - ['pharmacy_take'] = 'prendre %s', - ['medikit'] = 'kit de soin', - ['bandage'] = 'bandage', - ['max_item'] = 'vous en portez déjà assez sur vous.', - -- F6 Menu - ['ems_menu'] = 'interaction citoyen', - ['ems_menu_title'] = 'ambulance - Interactions Citoyen', - ['ems_menu_revive'] = 'réanimer', - ['ems_menu_putincar'] = 'mettre dans véhicule', - ['ems_menu_small'] = 'soigner petites blessures', - ['ems_menu_big'] = 'soigner blessures graves', - -- Phone - ['alert_ambulance'] = 'alerte Ambulance', - -- Death - ['respawn_available_in'] = 'réanimation possible dans ~b~%s minutes %s secondes~s~', - ['respawn_bleedout_in'] = 'vous allez souffrir d\'une hémorragie dans ~b~%s minutes %s secondes~s~\n', - ['respawn_bleedout_prompt'] = 'maintenez [~b~E~s~] pour être réanimé', - ['respawn_bleedout_fine'] = 'maintenez [~b~E~s~] pour être réanimé pour ~g~$%s~s~', - ['respawn_bleedout_fine_msg'] = 'vous avez payé ~r~$%s~s~ pour être réanimer.', - ['distress_send'] = 'appuyez sur [~b~G~s~] pour envoyer un signal de détresse', - ['distress_sent'] = 'un signal a été envoyé à toutes les unités disponibles!', - ['distress_message'] = 'interventtion requise: citoyen inconscient!', - ['combatlog_message'] = 'vous avez été réanimé de force car vous avez quitté le serveur.', - -- Revive - ['revive_help'] = 'relancer un joueur', - -- Item - ['used_medikit'] = 'vous avez utilisé 1x kit de soin', - ['used_bandage'] = 'vous avez utilisé 1x bandage', - ['not_enough_medikit'] = 'vous n\'avez pas de ~b~kit de soin~s~.', - ['not_enough_bandage'] = 'vous n\'avez pas de ~b~bandage~s~.', - ['healed'] = 'vous avez été soigné.', -} diff --git a/esx_ambulancejob/locales/pl.lua b/esx_ambulancejob/locales/pl.lua deleted file mode 100644 index 61778ccc..00000000 --- a/esx_ambulancejob/locales/pl.lua +++ /dev/null @@ -1,90 +0,0 @@ -Locales['pl'] = { - -- Cloakroom - ['cloakroom'] = 'szatnia', - ['ems_clothes_civil'] = 'ubrania cywilne', - ['ems_clothes_ems'] = 'ubrania EMS', - -- Vehicles - ['ambulance'] = 'ambulance', - ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', - ['helicopter_buy'] = 'helicopter shop', - ['helicopter_garage'] = 'open garage', - ['helicopter_store'] = 'store helicopter in garage', - ['helicopter_garage_title'] = 'helicopter Garage', - ['helicopter_title'] = 'helicopter Actions', - ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', - ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', - ['garage_title'] = 'vehicle Actions', - ['garage_stored'] = 'stored', - ['garage_notstored'] = 'not in garage', - ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', - ['garage_has_stored'] = 'the vehicle has been stored in your garage', - ['garage_has_notstored'] = 'no nearby owned vehicles were found', - ['garage_notavailable'] = 'your vehicle is not stored in the garage.', - ['garage_blocked'] = 'there\'s no available spawn points!', - ['garage_empty'] = 'you dont have any vehicles in your garage.', - ['garage_released'] = 'your vehicle has been released from the garage.', - ['garage_store_nearby'] = 'there is no nearby vehicles.', - ['garage_storeditem'] = 'open garage', - ['garage_storeitem'] = 'store vehicle in garage', - ['garage_buyitem'] = 'vehicle shop', - ['shop_item'] = '$%s', - ['vehicleshop_title'] = 'vehicle Shop', - ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', - ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', - ['vehicleshop_money'] = 'you cannot afford that vehicle', - ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', - ['confirm_no'] = 'no', - ['confirm_yes'] = 'yes', - -- Action Menu - ['hospital'] = 'szpital', - ['revive_inprogress'] = 'trwa wskrzeszenie', - ['revive_complete'] = 'zostałeś wskrzeszony ~y~%s~s~', - ['revive_complete_award'] = 'zostałeś wskrzeszony ~y~%s~s~ i zarobiono ~g~$%s~s~!', - ['heal_inprogress'] = 'leczysz!', - ['heal_complete'] = 'zostałeś uleczony ~y~%s~s~', - ['no_players'] = 'brak graczy w pobliżu', - ['no_vehicles'] = 'brak pojazdów w pobliżu', - ['player_not_unconscious'] = 'ten gracz nie jest nieprzytomny!', - ['player_not_conscious'] = 'ten gracz nie jest świadomy!', - -- Boss Menu - ['boss_actions'] = 'akcje szefa', - -- Misc - ['invalid_amount'] = '~r~Nieprawidłowa kwota', - ['actions_prompt'] = 'press ~INPUT_CONTEXT~ access the ~y~Ambulance Actions~s~.', - ['deposit_amount'] = 'kwota depozytu', - ['money_withdraw'] = 'wycofana kwota', - ['fast_travel'] = 'naciśnij na ~INPUT_CONTEXT~ do szybkiej podróży.', - ['open_pharmacy'] = 'naciśnij na ~INPUT_CONTEXT~ aby otworzyć aptekę', - ['pharmacy_menu_title'] = 'apteka', - ['pharmacy_take'] = 'weź %s', - ['medikit'] = 'apteczka', - ['bandage'] = 'bandaż', - ['max_item'] = 'już masz na sobie dość.', - -- F6 Menu - ['ems_menu'] = 'menu EMS', - ['ems_menu_title'] = 'eMS Menu - Ambulans', - ['ems_menu_revive'] = 'ożyw gracza', - ['ems_menu_putincar'] = 'umieścić w pojeździe', - ['ems_menu_small'] = 'ulecz małe rany', - ['ems_menu_big'] = 'ulecz poważne obrażenia', - -- Phone - ['alert_ambulance'] = 'wezwij ambulans', - -- Death - ['respawn_available_in'] = 'respawn available in ~b~%s minutes %s seconds~s~', - ['respawn_bleedout_in'] = 'you will bleed out in ~b~%s minutes %s seconds~s~\n', - ['respawn_bleedout_prompt'] = 'hold [~b~E~s~] to respawn', - ['respawn_bleedout_fine'] = 'hold [~b~E~s~] to respawn for ~g~$%s~s~', - ['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.', - ['distress_send'] = 'press [~b~G~s~] to send distress signal', - ['distress_sent'] = 'distress signal has been sent to available units!', - ['distress_message'] = 'medical attention required: unconscious citizen!', - ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.', - -- Revive - ['revive_help'] = 'ożyw gracza', - -- Item - ['used_medikit'] = 'użyłeś 1x Apteczki', - ['used_bandage'] = 'użyłeś 1x Bandaża', - ['not_enough_medikit'] = 'nie posiadasz ~b~apteczki~s~.', - ['not_enough_bandage'] = 'nie posiadasz ~b~bandaża~s~.', - ['healed'] = 'zostałeś potraktowany', -} diff --git a/esx_ambulancejob/locales/sv.lua b/esx_ambulancejob/locales/sv.lua deleted file mode 100644 index 0693cfd1..00000000 --- a/esx_ambulancejob/locales/sv.lua +++ /dev/null @@ -1,90 +0,0 @@ -Locales['sv'] = { - -- Cloakroom - ['cloakroom'] = 'omklädnignsrum', - ['ems_clothes_civil'] = 'civilkläder', - ['ems_clothes_ems'] = 'ambulanskläder', - -- Vehicles - ['ambulance'] = 'ambulance', - ['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.', - ['helicopter_buy'] = 'helicopter shop', - ['helicopter_garage'] = 'open garage', - ['helicopter_store'] = 'store helicopter in garage', - ['helicopter_garage_title'] = 'helicopter Garage', - ['helicopter_title'] = 'helicopter Actions', - ['helicopter_notauthorized'] = 'you\'re not authorized to buy helicopters.', - ['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.', - ['garage_title'] = 'vehicle Actions', - ['garage_stored'] = 'stored', - ['garage_notstored'] = 'not in garage', - ['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.', - ['garage_has_stored'] = 'the vehicle has been stored in your garage', - ['garage_has_notstored'] = 'no nearby owned vehicles were found', - ['garage_notavailable'] = 'your vehicle is not stored in the garage.', - ['garage_blocked'] = 'there\'s no available spawn points!', - ['garage_empty'] = 'you dont have any vehicles in your garage.', - ['garage_released'] = 'your vehicle has been released from the garage.', - ['garage_store_nearby'] = 'there is no nearby vehicles.', - ['garage_storeditem'] = 'open garage', - ['garage_storeitem'] = 'store vehicle in garage', - ['garage_buyitem'] = 'vehicle shop', - ['shop_item'] = '%s SEK', - ['vehicleshop_title'] = 'vehicle Shop', - ['vehicleshop_confirm'] = 'do you want to buy this vehicle?', - ['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~', - ['vehicleshop_money'] = 'you cannot afford that vehicle', - ['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait', - ['confirm_no'] = 'no', - ['confirm_yes'] = 'yes', - -- Action Menu - ['hospital'] = 'sjukhus', - ['revive_inprogress'] = 'en återupplivning har börjats', - ['revive_complete'] = 'du har återupplivat ~y~%s~s~, bra jobbat!', - ['revive_complete_award'] = 'du har återupplivat ~y~%s~s~ och tjärnat ~g~%s SEK~s~ för dina tjänster, bra jobbat!', - ['heal_inprogress'] = 'du behandlar patienten!', - ['heal_complete'] = 'du har behandlat ~y~%s~s~', - ['no_players'] = 'det finns inga spelare i närheten!', - ['no_vehicles'] = 'det finns inget fordon i närheten!', - ['player_not_unconscious'] = 'spelaren är inte medvetslös!', - ['player_not_conscious'] = 'spelaren är inte vid medvetande!', - -- Boss Menu - ['boss_actions'] = 'chef meny', - -- Misc - ['invalid_amount'] = '~r~Ogiltig mängd', - ['actions_prompt'] = 'tryck ~INPUT_CONTEXT~ för att öppna menyn.', - ['deposit_amount'] = 'mängd att sätta in', - ['money_withdraw'] = 'mängd att ta ut', - ['fast_travel'] = 'tryck på ~INPUT_CONTEXT~ för att snabbresa.', - ['open_pharmacy'] = 'tryck på ~INPUT_CONTEXT~ för att öppna apoteket.', - ['pharmacy_menu_title'] = 'apotek', - ['pharmacy_take'] = 'ta %s', - ['medikit'] = 'medicinkit', - ['bandage'] = 'bandage', - ['max_item'] = 'du har redan tillräckligt mycket på dig.', - -- F6 Menu - ['ems_menu'] = 'ambulansmeny', - ['ems_menu_title'] = 'ambulansmeny', - ['ems_menu_revive'] = 'återuppliva spelare', - ['ems_menu_putincar'] = 'sätt i fordon', - ['ems_menu_small'] = 'behandla mindre skador', - ['ems_menu_big'] = 'behandla svåra skador', - -- Phone - ['alert_ambulance'] = 'ambulanssamtal', - -- Death - ['respawn_available_in'] = 'respawn tillgänglig om ~b~%s:%s~s~', - ['respawn_bleedout_in'] = 'du kommer att blöda ut om ~b~%s:%s~s~\n', - ['respawn_bleedout_prompt'] = 'håll [~b~E~s~] för att respawna', - ['respawn_bleedout_fine'] = 'håll [~b~E~s~] för att respawna, kostar ~g~%s SEK~s~', - ['respawn_bleedout_fine_msg'] = 'du betalade ~r~%s SEK~s~ för att respawna.', - ['distress_send'] = 'tryck ~b~[G]~s~ för att skicka nödsignal', - ['distress_sent'] = 'nödsignal har skickats till samtliga enheter!', - ['distress_message'] = 'läkarvård krävs: medvetslös medborgare!', - ['combatlog_message'] = 'du har force-respawnats på grund av att du lämnat servern medans du var död', - -- Revive - ['revive_help'] = 'återuppliva en spelare', - -- Item - ['used_medikit'] = 'du har använt ~y~1x~s~ ~b~Medecinkit~s~', - ['used_bandage'] = 'du har använt ~y~1x~s~ ~b~Bandage~s~', - ['not_enough_medikit'] = 'du har inget ~b~Medecinkit~s~.', - ['not_enough_bandage'] = 'du har inget ~b~Bandage~s~.', - ['healed'] = 'dina skador har blivit behandlade.', -} diff --git a/esx_ambulancejob/localization/cs_esx_ambulancejob.sql b/esx_ambulancejob/localization/cs_esx_ambulancejob.sql deleted file mode 100644 index a8af1939..00000000 --- a/esx_ambulancejob/localization/cs_esx_ambulancejob.sql +++ /dev/null @@ -1,33 +0,0 @@ -USE `essentialmode`; - -INSERT INTO `addon_account` (name, label, shared) VALUES - ('society_ambulance', 'Záchranka', 1) -; - -INSERT INTO `addon_inventory` (name, label, shared) VALUES - ('society_ambulance', 'Záchranka', 1) -; - -INSERT INTO `datastore` (name, label, shared) VALUES - ('society_ambulance', 'Záchranka', 1) -; - -INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES - ('ambulance',0,'ambulance','Zdravotník',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',1,'doctor','Doktor',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',2,'chief_doctor','Primář',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',3,'boss','Chirurg',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') -; - -INSERT INTO `jobs` (name, label) VALUES - ('ambulance','Záchranka') -; - -INSERT INTO `items` (name, label, `limit`) VALUES - ('bandage','Obvaz', 20), - ('medikit','Lékarnička', 5) -; - -ALTER TABLE `users` - ADD `is_dead` TINYINT(1) NULL DEFAULT '0' -; diff --git a/esx_ambulancejob/localization/de_esx_ambulancejob.sql b/esx_ambulancejob/localization/de_esx_ambulancejob.sql deleted file mode 100644 index 0ebf079d..00000000 --- a/esx_ambulancejob/localization/de_esx_ambulancejob.sql +++ /dev/null @@ -1,33 +0,0 @@ -USE `essentialmode`; - -INSERT INTO `addon_account` (name, label, shared) VALUES - ('society_ambulance', 'Notdienst', 1) -; - -INSERT INTO `addon_inventory` (name, label, shared) VALUES - ('society_ambulance', 'Ambulance', 1) -; - -INSERT INTO `datastore` (name, label, shared) VALUES - ('society_ambulance', 'Ambulance', 1) -; - -INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES - ('ambulance',0,'ambulance','Sanitäter',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',1,'doctor','Arzt',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',2,'chief_doctor','Chefarzt',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',3,'boss','Chirurg',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') -; - -INSERT INTO `jobs` (name, label) VALUES - ('ambulance','Notdienst') -; - -INSERT INTO `items` (name, label, `limit`) VALUES - ('bandage','Bandage', 20), - ('medikit','Medikit', 5) -; - -ALTER TABLE `users` - ADD `is_dead` TINYINT(1) NULL DEFAULT '0' -; diff --git a/esx_ambulancejob/localization/en_esx_ambulancejob.sql b/esx_ambulancejob/localization/en_esx_ambulancejob.sql deleted file mode 100644 index 6bb4ecf1..00000000 --- a/esx_ambulancejob/localization/en_esx_ambulancejob.sql +++ /dev/null @@ -1,33 +0,0 @@ -USE `essentialmode`; - -INSERT INTO `addon_account` (name, label, shared) VALUES - ('society_ambulance', 'EMS', 1) -; - -INSERT INTO `addon_inventory` (name, label, shared) VALUES - ('society_ambulance', 'EMS', 1) -; - -INSERT INTO `datastore` (name, label, shared) VALUES - ('society_ambulance', 'EMS', 1) -; - -INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES - ('ambulance',0,'ambulance','Jr. EMT',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',1,'doctor','EMT',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',2,'chief_doctor','Sr. EMT',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',3,'boss','EMT Supervisor',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') -; - -INSERT INTO `jobs` (name, label) VALUES - ('ambulance','EMS') -; - -INSERT INTO `items` (name, label, `limit`) VALUES - ('bandage','Bandage', 20), - ('medikit','Medikit', 5) -; - -ALTER TABLE `users` - ADD `is_dead` TINYINT(1) NULL DEFAULT '0' -; diff --git a/esx_ambulancejob/localization/fi_esx_ambulancejob.sql b/esx_ambulancejob/localization/fi_esx_ambulancejob.sql deleted file mode 100644 index 7c001e0d..00000000 --- a/esx_ambulancejob/localization/fi_esx_ambulancejob.sql +++ /dev/null @@ -1,33 +0,0 @@ -USE `essentialmode`; - -INSERT INTO `addon_account` (name, label, shared) VALUES - ('society_ambulance', 'Ensihoito', 1) -; - -INSERT INTO `addon_inventory` (name, label, shared) VALUES - ('society_ambulance', 'Ensihoito', 1) -; - -INSERT INTO `datastore` (name, label, shared) VALUES - ('society_ambulance', 'Ensihoito', 1) -; - -INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES - ('ambulance',0,'ambulance','Ensihoitaja',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',1,'doctor','Lääkäri',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',2,'chief_doctor','Yli-lääkäri',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',3,'boss','Kirurgi',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') -; - -INSERT INTO `jobs` (name, label) VALUES - ('ambulance','Ensihoito') -; - -INSERT INTO `items` (name, label, `limit`) VALUES - ('bandage','Sideharso', 20), - ('medikit','Ensiapupakkaus', 5) -; - -ALTER TABLE `users` - ADD `is_dead` TINYINT(1) NULL DEFAULT '0' -; diff --git a/esx_ambulancejob/localization/pl_esx_ambulancejob.sql b/esx_ambulancejob/localization/pl_esx_ambulancejob.sql deleted file mode 100644 index c3715181..00000000 --- a/esx_ambulancejob/localization/pl_esx_ambulancejob.sql +++ /dev/null @@ -1,33 +0,0 @@ -USE `essentialmode`; - -INSERT INTO `addon_account` (name, label, shared) VALUES - ('society_ambulance', 'Ambulance', 1) -; - -INSERT INTO `addon_inventory` (name, label, shared) VALUES - ('society_ambulance', 'Ambulance', 1) -; - -INSERT INTO `datastore` (name, label, shared) VALUES - ('society_ambulance', 'Pogotowie ratunkowe', 1) -; - -INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES - ('ambulance',0,'ambulance','Ratownik',20,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',1,'doctor','Lekarz',40,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',2,'chief_doctor','Chirurg',60,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), - ('ambulance',3,'boss','Ordynator',80,'{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}','{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}') -; - -INSERT INTO `jobs` (name, label) VALUES - ('ambulance','Pogotowie ratunkowe') -; - -INSERT INTO `items` (name, label, `limit`) VALUES - ('bandage','Bandaż', 20), - ('medikit','Defibrylator', 5) -; - -ALTER TABLE `users` - ADD `is_dead` TINYINT(1) NULL DEFAULT '0' -; diff --git a/esx_ambulancejob/server/main.lua b/esx_ambulancejob/server/main.lua deleted file mode 100644 index 0f5b78d9..00000000 --- a/esx_ambulancejob/server/main.lua +++ /dev/null @@ -1,306 +0,0 @@ -ESX = nil -local playersHealing = {} - -TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) - -RegisterServerEvent('esx_ambulancejob:revive') -AddEventHandler('esx_ambulancejob:revive', function(target) - local xPlayer = ESX.GetPlayerFromId(source) - - if xPlayer.job.name == 'ambulance' then - xPlayer.addMoney(Config.ReviveReward) - TriggerClientEvent('esx_ambulancejob:revive', target) - else - print(('esx_ambulancejob: %s attempted to revive!'):format(xPlayer.identifier)) - end -end) - -RegisterServerEvent('esx_ambulancejob:heal') -AddEventHandler('esx_ambulancejob:heal', function(target, type) - local xPlayer = ESX.GetPlayerFromId(source) - - if xPlayer.job.name == 'ambulance' then - TriggerClientEvent('esx_ambulancejob:heal', target, type) - else - print(('esx_ambulancejob: %s attempted to heal!'):format(xPlayer.identifier)) - end -end) - -RegisterServerEvent('esx_ambulancejob:putInVehicle') -AddEventHandler('esx_ambulancejob:putInVehicle', function(target) - local xPlayer = ESX.GetPlayerFromId(source) - - if xPlayer.job.name == 'ambulance' then - TriggerClientEvent('esx_ambulancejob:putInVehicle', target) - else - print(('esx_ambulancejob: %s attempted to put in vehicle!'):format(xPlayer.identifier)) - end -end) - -TriggerEvent('esx_phone:registerNumber', 'ambulance', _U('alert_ambulance'), true, true) - -TriggerEvent('esx_society:registerSociety', 'ambulance', 'Ambulance', 'society_ambulance', 'society_ambulance', 'society_ambulance', {type = 'public'}) - -ESX.RegisterServerCallback('esx_ambulancejob:removeItemsAfterRPDeath', function(source, cb) - local xPlayer = ESX.GetPlayerFromId(source) - - if Config.RemoveCashAfterRPDeath then - if xPlayer.getMoney() > 0 then - xPlayer.removeMoney(xPlayer.getMoney()) - end - - if xPlayer.getAccount('black_money').money > 0 then - xPlayer.setAccountMoney('black_money', 0) - end - end - - if Config.RemoveItemsAfterRPDeath then - for i=1, #xPlayer.inventory, 1 do - if xPlayer.inventory[i].count > 0 then - xPlayer.setInventoryItem(xPlayer.inventory[i].name, 0) - end - end - end - - local playerLoadout = {} - if Config.RemoveWeaponsAfterRPDeath then - for i=1, #xPlayer.loadout, 1 do - xPlayer.removeWeapon(xPlayer.loadout[i].name) - end - else -- save weapons & restore em' since spawnmanager removes them - for i=1, #xPlayer.loadout, 1 do - table.insert(playerLoadout, xPlayer.loadout[i]) - end - - -- give back wepaons after a couple of seconds - Citizen.CreateThread(function() - Citizen.Wait(5000) - for i=1, #playerLoadout, 1 do - if playerLoadout[i].label ~= nil then - xPlayer.addWeapon(playerLoadout[i].name, playerLoadout[i].ammo) - end - end - end) - end - - cb() -end) - -if Config.EarlyRespawnFine then - ESX.RegisterServerCallback('esx_ambulancejob:checkBalance', function(source, cb) - local xPlayer = ESX.GetPlayerFromId(source) - local bankBalance = xPlayer.getAccount('bank').money - - cb(bankBalance >= Config.EarlyRespawnFineAmount) - end) - - RegisterServerEvent('esx_ambulancejob:payFine') - AddEventHandler('esx_ambulancejob:payFine', function() - local xPlayer = ESX.GetPlayerFromId(source) - local fineAmount = Config.EarlyRespawnFineAmount - - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('respawn_bleedout_fine_msg', ESX.Math.GroupDigits(fineAmount))) - xPlayer.removeAccountMoney('bank', fineAmount) - end) -end - -ESX.RegisterServerCallback('esx_ambulancejob:getItemAmount', function(source, cb, item) - local xPlayer = ESX.GetPlayerFromId(source) - local quantity = xPlayer.getInventoryItem(item).count - - cb(quantity) -end) - -ESX.RegisterServerCallback('esx_ambulancejob:buyJobVehicle', function(source, cb, vehicleProps, type) - local xPlayer = ESX.GetPlayerFromId(source) - local price = getPriceFromHash(vehicleProps.model, xPlayer.job.grade_name, type) - - -- vehicle model not found - if price == 0 then - print(('esx_ambulancejob: %s attempted to exploit the shop! (invalid vehicle model)'):format(xPlayer.identifier)) - cb(false) - else - if xPlayer.getMoney() >= price then - xPlayer.removeMoney(price) - - MySQL.Async.execute('INSERT INTO owned_vehicles (owner, vehicle, plate, type, job, `stored`) VALUES (@owner, @vehicle, @plate, @type, @job, @stored)', { - ['@owner'] = xPlayer.identifier, - ['@vehicle'] = json.encode(vehicleProps), - ['@plate'] = vehicleProps.plate, - ['@type'] = type, - ['@job'] = xPlayer.job.name, - ['@stored'] = true - }, function (rowsChanged) - cb(true) - end) - else - cb(false) - end - end -end) - -ESX.RegisterServerCallback('esx_ambulancejob:storeNearbyVehicle', function(source, cb, nearbyVehicles) - local xPlayer = ESX.GetPlayerFromId(source) - local foundPlate, foundNum - - for k,v in ipairs(nearbyVehicles) do - local result = MySQL.Sync.fetchAll('SELECT plate FROM owned_vehicles WHERE owner = @owner AND plate = @plate AND job = @job', { - ['@owner'] = xPlayer.identifier, - ['@plate'] = v.plate, - ['@job'] = xPlayer.job.name - }) - - if result[1] then - foundPlate, foundNum = result[1].plate, k - break - end - end - - if not foundPlate then - cb(false) - else - MySQL.Async.execute('UPDATE owned_vehicles SET `stored` = true WHERE owner = @owner AND plate = @plate AND job = @job', { - ['@owner'] = xPlayer.identifier, - ['@plate'] = foundPlate, - ['@job'] = xPlayer.job.name - }, function (rowsChanged) - if rowsChanged == 0 then - print(('esx_ambulancejob: %s has exploited the garage!'):format(xPlayer.identifier)) - cb(false) - else - cb(true, foundNum) - end - end) - end - -end) - -function getPriceFromHash(hashKey, jobGrade, type) - if type == 'helicopter' then - local vehicles = Config.AuthorizedHelicopters[jobGrade] - - for k,v in ipairs(vehicles) do - if GetHashKey(v.model) == hashKey then - return v.price - end - end - elseif type == 'car' then - local vehicles = Config.AuthorizedVehicles[jobGrade] - - for k,v in ipairs(vehicles) do - if GetHashKey(v.model) == hashKey then - return v.price - end - end - end - - return 0 -end - -RegisterServerEvent('esx_ambulancejob:removeItem') -AddEventHandler('esx_ambulancejob:removeItem', function(item) - local _source = source - local xPlayer = ESX.GetPlayerFromId(_source) - - xPlayer.removeInventoryItem(item, 1) - - if item == 'bandage' then - TriggerClientEvent('esx:showNotification', _source, _U('used_bandage')) - elseif item == 'medikit' then - TriggerClientEvent('esx:showNotification', _source, _U('used_medikit')) - end -end) - -RegisterServerEvent('esx_ambulancejob:giveItem') -AddEventHandler('esx_ambulancejob:giveItem', function(itemName) - local xPlayer = ESX.GetPlayerFromId(source) - - if xPlayer.job.name ~= 'ambulance' then - print(('esx_ambulancejob: %s attempted to spawn in an item!'):format(xPlayer.identifier)) - return - elseif (itemName ~= 'medikit' and itemName ~= 'bandage') then - print(('esx_ambulancejob: %s attempted to spawn in an item!'):format(xPlayer.identifier)) - return - end - - local xItem = xPlayer.getInventoryItem(itemName) - local count = 1 - - if xItem.limit ~= -1 then - count = xItem.limit - xItem.count - end - - if xItem.count < xItem.limit then - xPlayer.addInventoryItem(itemName, count) - else - TriggerClientEvent('esx:showNotification', source, _U('max_item')) - end -end) - -TriggerEvent('es:addGroupCommand', 'revive', 'admin', function(source, args, user) - if args[1] ~= nil then - if GetPlayerName(tonumber(args[1])) ~= nil then - print(('esx_ambulancejob: %s used admin revive'):format(GetPlayerIdentifiers(source)[1])) - TriggerClientEvent('esx_ambulancejob:revive', tonumber(args[1])) - end - else - TriggerClientEvent('esx_ambulancejob:revive', source) - end -end, function(source, args, user) - TriggerClientEvent('chat:addMessage', source, { args = { '^1SYSTEM', 'Insufficient Permissions.' } }) -end, { help = _U('revive_help'), params = {{ name = 'id' }} }) - -ESX.RegisterUsableItem('medikit', function(source) - if not playersHealing[source] then - local xPlayer = ESX.GetPlayerFromId(source) - xPlayer.removeInventoryItem('medikit', 1) - - playersHealing[source] = true - TriggerClientEvent('esx_ambulancejob:useItem', source, 'medikit') - - Citizen.Wait(10000) - playersHealing[source] = nil - end -end) - -ESX.RegisterUsableItem('bandage', function(source) - if not playersHealing[source] then - local xPlayer = ESX.GetPlayerFromId(source) - xPlayer.removeInventoryItem('bandage', 1) - - playersHealing[source] = true - TriggerClientEvent('esx_ambulancejob:useItem', source, 'bandage') - - Citizen.Wait(10000) - playersHealing[source] = nil - end -end) - -ESX.RegisterServerCallback('esx_ambulancejob:getDeathStatus', function(source, cb) - local identifier = GetPlayerIdentifiers(source)[1] - - MySQL.Async.fetchScalar('SELECT is_dead FROM users WHERE identifier = @identifier', { - ['@identifier'] = identifier - }, function(isDead) - if isDead then - print(('esx_ambulancejob: %s attempted combat logging!'):format(identifier)) - end - - cb(isDead) - end) -end) - -RegisterServerEvent('esx_ambulancejob:setDeathStatus') -AddEventHandler('esx_ambulancejob:setDeathStatus', function(isDead) - local identifier = GetPlayerIdentifiers(source)[1] - - if type(isDead) ~= 'boolean' then - print(('esx_ambulancejob: %s attempted to parse something else than a boolean to setDeathStatus!'):format(identifier)) - return - end - - MySQL.Sync.execute('UPDATE users SET is_dead = @isDead WHERE identifier = @identifier', { - ['@identifier'] = identifier, - ['@isDead'] = isDead - }) -end) diff --git a/esx_kashacter-edited-bluebens.zip b/esx_kashacter-edited-bluebens.zip deleted file mode 100644 index 03a5e5e14e52963887af883a299bdc96b7b6e395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193522 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

^~!Xj-Q%-_Pd^% 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 zORgef

'+ char.firstname +' '+ char.lastname +'

').attr("data-ischar", "true"); + $('[data-charid=' + charid + ']').html('

'+ char.firstname +' '+ char.lastname +'

Work: '+ char.job +' '+ char.job_grade +'

Cash: '+ char.money +'

Bank: '+ char.bank +'

Date of birth: '+ char.dateofbirth +'

Gender: '+ char.sex +'

').attr("data-ischar", "true"); } }); } From 114387498ee259b1794312a8b16121ef1e82de42 Mon Sep 17 00:00:00 2001 From: Henric Backman Date: Fri, 10 Apr 2020 05:47:34 +0200 Subject: [PATCH 056/205] Fix MySQL to get propper job grade and filter it if the character is Unemployed --- esx_kashacters/server/main.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index b5b78700..45b4396d 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -56,12 +56,16 @@ function GetPlayerCharacters(source) for i = 1, #Chars, 1 do charJob = MySQLAsyncExecute("SELECT * FROM `jobs` WHERE `name` = '"..Chars[i].job.."'") - charJobgrade = MySQLAsyncExecute("SELECT * FROM `job_grades` WHERE `grade` = '"..Chars[i].job_grade.."'") + charJobgrade = MySQLAsyncExecute("SELECT * FROM `job_grades` WHERE `grade` = '"..Chars[i].job_grade.."' AND `job_name` = '"..Chars[i].job.."'") local accounts = json.decode(Chars[i].accounts) Chars[i].bank = accounts["bank"] Chars[i].money = accounts["money"] Chars[i].job = charJob[1].label - Chars[i].job_grade = charJobgrade[1].label + if charJobgrade[1].label ~= "Unemployed" then + Chars[i].job_grade = charJobgrade[1].label + else + Chars[i].job_grade = "" + end end return Chars From 34a9f1b0d5e0ce29ba88bde12152c87c7a96aef0 Mon Sep 17 00:00:00 2001 From: Uniixx Date: Sun, 12 Apr 2020 17:29:00 -0400 Subject: [PATCH 057/205] Multiple languages support Supports many languages such as French, English and Polish (used Google Translate) Also fixed a typo in the readme and added instructions on how to change the language. Sorry I had to repush again due to my last repository being broke. --- esx_kashacters/fxmanifest.lua | 3 +++ esx_kashacters/html/js/app.js | 4 ++-- esx_kashacters/html/locales/en.js | 12 ++++++++++++ esx_kashacters/html/locales/fr.js | 12 ++++++++++++ esx_kashacters/html/locales/pl.js | 12 ++++++++++++ esx_kashacters/html/ui.html | 19 +++++++++++++++---- readme-pl.md | 3 +++ readme.md | 5 ++++- 8 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 esx_kashacters/html/locales/en.js create mode 100644 esx_kashacters/html/locales/fr.js create mode 100644 esx_kashacters/html/locales/pl.js diff --git a/esx_kashacters/fxmanifest.lua b/esx_kashacters/fxmanifest.lua index 4a1064b0..bcb3e2b9 100644 --- a/esx_kashacters/fxmanifest.lua +++ b/esx_kashacters/fxmanifest.lua @@ -19,6 +19,9 @@ files { 'html/ui.html', 'html/css/main.css', 'html/js/app.js', + 'html/locales/fr.js', + 'html/locales/en.js', + 'html/locales/pl.js', } dependency 'es_extended' diff --git a/esx_kashacters/html/js/app.js b/esx_kashacters/html/js/app.js index e01f864c..7116b356 100644 --- a/esx_kashacters/html/js/app.js +++ b/esx_kashacters/html/js/app.js @@ -47,7 +47,7 @@ $("#deletechar").click(function () { $.each(data.characters, function (index, char) { if (char.charid !== 0) { var charid = char.identifier.charAt(4); - $('[data-charid=' + charid + ']').html('

'+ char.firstname +' '+ char.lastname +'

Work: '+ char.job +'

Cash: '+ char.money +'

Bank: '+ char.bank +'

Date of birth: '+ char.dateofbirth +'

Gender: '+ char.sex +'

').attr("data-ischar", "true"); + $('[data-charid=' + charid + ']').html('

' + char.firstname + ' ' + char.lastname + '

' + `${translate.job}: ` + '' + char.job + '

' + `${translate.money}: ` + '' + char.money + '

' + `${translate.bank}: ` + '' + char.bank + '

' + `${translate.dob}: ` + '' + char.dateofbirth + '

' + `${translate.gender}: ` + ''+ char.sex +'

').attr("data-ischar", "true"); } }); } @@ -57,7 +57,7 @@ $("#deletechar").click(function () { $('.main-container').css({"display":"none"}); $(".character-box").removeClass('active-char'); $("#delete").css({"display":"none"}); - $(".character-box").html('

Create new character

').attr("data-ischar", "false"); + $(".character-box").html('

' + `${translate.new}` + '

').attr("data-ischar", "false"); }; window.onload = function(e) { window.addEventListener('message', function(event) { diff --git a/esx_kashacters/html/locales/en.js b/esx_kashacters/html/locales/en.js new file mode 100644 index 00000000..7a6acfe2 --- /dev/null +++ b/esx_kashacters/html/locales/en.js @@ -0,0 +1,12 @@ +const translate = new Object(); + +translate.job = "Job"; +translate.bank = "Bank"; +translate.money = "Cash"; +translate.gender = "Gender"; +translate.dob = "Date of birth"; +translate.new = "Create new character"; +translate.delete = "DELETE"; +translate.play = "PLAY"; +translate.modalTitle = "Are You Sure?"; +translate.modalText = "By deleting your account we won't be able to recover it, all properties, cars etc. will be deleted"; \ No newline at end of file diff --git a/esx_kashacters/html/locales/fr.js b/esx_kashacters/html/locales/fr.js new file mode 100644 index 00000000..79059b34 --- /dev/null +++ b/esx_kashacters/html/locales/fr.js @@ -0,0 +1,12 @@ +const translate = new Object(); + +translate.job = "Métier"; +translate.bank = "Banque"; +translate.money = "Argent"; +translate.gender = "Sexe"; +translate.dob = "Date de naissance"; +translate.new = "Créer un personnage"; +translate.delete = "SUPPRIMER"; +translate.play = "JOUER"; +translate.modalTitle = "Êtes-vous sûr?"; +translate.modalText = "En supprimant votre personnage, vous ne pourrez pas le récupérer. Toutes les informations seront supprimées."; \ No newline at end of file diff --git a/esx_kashacters/html/locales/pl.js b/esx_kashacters/html/locales/pl.js new file mode 100644 index 00000000..9661de05 --- /dev/null +++ b/esx_kashacters/html/locales/pl.js @@ -0,0 +1,12 @@ +const translate = new Object(); + +translate.job = "Zajęcie"; +translate.bank = "Bank"; +translate.money = "Gotówka"; +translate.gender = "Seks"; +translate.dob = "Data urodzenia"; +translate.new = "Utwórz nową postać"; +translate.delete = "KASOWAĆ"; +translate.play = "GRAĆ"; +translate.modalTitle = "Jesteś pewny?"; +translate.modalText = "Po usunięciu konta nie będziemy mogli go odzyskać, wszystkie nieruchomości, samochody itp. Zostaną usunięte"; \ No newline at end of file diff --git a/esx_kashacters/html/ui.html b/esx_kashacters/html/ui.html index 3e5df858..2c631072 100644 --- a/esx_kashacters/html/ui.html +++ b/esx_kashacters/html/ui.html @@ -7,6 +7,7 @@ + @@ -16,7 +17,7 @@

-

Create new character

+

@@ -51,9 +52,9 @@

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%0A3Z?s-$=wWtTL>R*a?6yGmaa9i^ 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 diff --git a/mysql-async/.editorconfig b/mysql-async/.editorconfig deleted file mode 100644 index 3fa23bc3..00000000 --- a/mysql-async/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -root = true - -[**.js] -charset = utf-8 -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -max_line_length = null - -[**.md] -trim_trailing_whitespace = false diff --git a/mysql-async/.gitignore b/mysql-async/.gitignore deleted file mode 100644 index 33f41cdb..00000000 --- a/mysql-async/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -src/node_modules -src/package-lock.json - -.idea diff --git a/mysql-async/LICENSE b/mysql-async/LICENSE deleted file mode 100644 index 8971eee6..00000000 --- a/mysql-async/LICENSE +++ /dev/null @@ -1,14 +0,0 @@ -Copyright © 2017, Joel Wurtz; © 2018 - 2019 Matthias Mandelartz - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -documentation files (the “Software”), to deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the -Software. - -The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the -warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or -copyright holders X be liable for any claim, damages or other liability, whether in an action of contract, tort or -otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software. diff --git a/mysql-async/README.md b/mysql-async/README.md deleted file mode 100644 index 4bfab6e2..00000000 --- a/mysql-async/README.md +++ /dev/null @@ -1,137 +0,0 @@ -# mysql-async Library for FiveM - -This library intends to provide function to connect to a MySQL library in a Sync and Async way. - -## Table of Contents -* [Installation](#installation) -* [Configuration](#configuration) - * [keepAlive](#keepalive) - * [ConVars](#convars) -* [GUI](#gui) -* [Usage](#usage) -* [Features](#features) - - -## Installation - -Install the content of this repository in the `resources/mysql-async` folder. **Name of the folder** matters, -do not use a different name (otherwise you must have knowledge on how this works and make the appropriate changes) - -Once installed, you will need to add this line of code in the resource file of each mod needing a MySQL client: - -``` -server_script '@mysql-async/lib/MySQL.lua' -``` - -## Configuration - -Add this convar to your server configuration and change the values according to your MySQL installation: - -`set mysql_connection_string "server=localhost;uid=mysqluser;password=password;database=fivem"` - -Alternatively an url-like connection string can be used: - -`set mysql_connection_string "mysql://username:password@host/database"` - -Further options can be found under https://github.com/mysqljs/mysql#connection-options for the mysql.js connection string, they can be added on both: the semicolon seperated string or the url-like string. - -### keepAlive - -For people, having issues with the connection being interrupted for usually a bad network configuration, but have no way of figuring out what is wrong, there is an option to enable keep alive queries. This will execute a query on the given interval. To enable those keep alive queries, append e.g. `keepAlive=60` to your connection string, seperated with a semicolon, to ensure that a keep alive query is fired every 60s. - -### ConVars - -The following ConVars are available in the `server.cfg` which you execute. These have also to be set before `start mysql-async` -* `set mysql_debug 1`: Prints out the actual consumed query. -* `set mysql_debug_output "console"`: Select where to output the log, accepts `console`, `file`, and `both`. In case of `both` and `file` a file named `mysql-async.log` in your main server folder will be created. -* `set mysql_slow_query_warning 200`: Sets a limit in ms, queries slower than this limit will be displayed with a warning at the specified location of `mysql_debug_output`, see above. - -## GUI - -Since the newest version, anyone with ace admin rights can open the GUI by typing `mysql` in the F8 console. This opens a profiling view of the data collected by this middleware, that might help you optimize resources and queries. You can disable the viewing of certain data by clicking on the respective entry in the legends, and can browse a table of the 21 slowest performing queries. - -## Usage - -### Waiting for MySQL to be ready - -You need to encapsulate your code into `MySQL.ready` to be sure that the mod will be available and initialized -before your first request. - -```lua -MySQL.ready(function () - print(MySQL.Sync.fetchScalar('SELECT @parameters', { - ['@parameters'] = 'string' - })) -end) -``` - -### Async - -#### MySQL.Async.execute(string query, array params, function callback) - -Works like `MySQL.Sync.execute` but will return immediatly instead of waiting for the execution of the query. -To exploit the result of an async method you must use a callback function: - -```lua -MySQL.Async.execute('SELECT SLEEP(10)', {}, function(rowsChanged) - print(rowsChanged) -end) -``` - -#### MySQL.Async.fetchAll(string query, array params, function callback) - -Works like `MySQL.Sync.fetchAll` and provide callback like the `MySQL.Async.execute` method: - -```lua -MySQL.Async.fetchAll('SELECT * FROM player', {}, function(players) - print(players[1].name) -end) -``` - -#### MySQL.Async.fetchScalar(string query, array params, function callback) - -Same as before for the fetchScalar method. - -```lua -MySQL.Async.fetchScalar("SELECT COUNT(1) FROM players", function(countPlayer) - print(countPlayer) -end -``` - -### Sync - -> Sync functions can block the main thread, always prefer the Async version if possible, there is very rare -> use case for you to use this. - -#### MySQL.Sync.execute(string query, array params) : int - -Execute a mysql query which should not send any result (like a Insert / Delete / Update), and will return the -number of affected rows. - -```lua -MySQL.Sync.execute("UPDATE player SET name=@name WHERE id=@id", {['@id'] = 10, ['@name'] = 'foo'}) -``` - -#### MySQL.Sync.fetchAll(string query, array params) : object[] - -Fetch results from MySQL and returns them in the form of an Array of Objects: - -```lua -local players = MySQL.Sync.fetchAll('SELECT id, name FROM player') -print(players[1].id) -``` - -#### MySQL.Sync.fetchScalar(string query, array params) : mixed - -Fetch the first field of the first row in a query: - -```lua -local countPlayer = MySQL.Sync.fetchScalar("SELECT COUNT(1) FROM players") -``` - -## Features - - * Async / Sync. - * It uses the https://github.com/mysqljs/mysql library to provide a connection to your mysql server. - * Create and close a connection for each query, the underlying library use a connection pool so only the -mysql auth is done each time, old tcp connections are keeped in memory for performance reasons. diff --git a/mysql-async/UPGRADING.md b/mysql-async/UPGRADING.md deleted file mode 100644 index 9d5327a7..00000000 --- a/mysql-async/UPGRADING.md +++ /dev/null @@ -1,55 +0,0 @@ -# Upgrading from Legacy Server - -## A note about EssentialMode - -This library does not provide api compatibility with EssentialMode. The reason is that old API was not logic due to the - way on how mysql work which was inducing bad behavior, like executing multiple queries instead of one, or using only one - connection for all players (which was the main source of bug, having sync is not a problem as long as you know what you - are doing). - -Then if you come from legacy server and still using essential mod API, you should update by using this path: - - * Use the 1.0 of this library and read the UPGRADING.md file of it to use the new API - * Then you can Update to fxserver and use the 2.X version of this lib - * Then read the following advices on how to update your existing codebase for the 2.0 version - -## Require - -The `require` keyword does not exist anymore and will throw an error on fxserver. You should remove all references to -require, there is no replacement as this is no longer useful. - -However you will have to add this line to your resource file `__resource.lua` in order to have access to the mysql async: - -```lua -server_script '@mysql-async/lib/MySQL.lua' -``` - -## Configuration - -There is no more configuration file in this lib, instead it use directly a `conv_var` which is basically a variable set -in the configuration file of your fxserver `server.cfg` - -So you can remove the config file that you were having and add this line into your `server.cfg` file : - -``` -set mysql_connection_string "server=mariadb;database=fivem;userid=root;password=fivem" -``` - -It is highly recommended to set those variable **before** starting modules so they will be available directly on startup -(even if we provide some safety check for someone defining this var after...) - -## Startup code with queries - -You may have some sql queries at the start of your module, however due to the new way of loading modules in fxserver -(which is somehow async): Your library can be loaded before mysql-async even if you start it after. - -To handle this use case, this library provide a special event `onMySQLReady` that is emitted once it's loaded, so you can do: - -```lua -AddEventHandler('onMySQLReady', function () - -- Startup code using mysql -end) -``` - - - diff --git a/mysql-async/__resource.lua b/mysql-async/__resource.lua deleted file mode 100644 index ad95aa37..00000000 --- a/mysql-async/__resource.lua +++ /dev/null @@ -1,24 +0,0 @@ -resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' - -version '3.2.0' - -server_script 'mysql-async.js' -client_script 'mysql-async-client.js' - -files { - 'ui/index.html', - 'ui/app.js', - 'ui/app.css', - 'ui/fonts/fira-sans-v9-latin-700.woff', - 'ui/fonts/fira-sans-v9-latin-700.woff2', - 'ui/fonts/fira-sans-v9-latin-italic.woff', - 'ui/fonts/fira-sans-v9-latin-italic.woff2', - 'ui/fonts/fira-sans-v9-latin-regular.woff', - 'ui/fonts/fira-sans-v9-latin-regular.woff2', - 'ui/fonts/MaterialIcons-Regular.eot', - 'ui/fonts/MaterialIcons-Regular.ttf', - 'ui/fonts/MaterialIcons-Regular.woff', - 'ui/fonts/MaterialIcons-Regular.woff2', -} - -ui_page 'ui/index.html' diff --git a/mysql-async/example.lua b/mysql-async/example.lua deleted file mode 100644 index 13ef9f5f..00000000 --- a/mysql-async/example.lua +++ /dev/null @@ -1,84 +0,0 @@ ---executed = 0 ---received = 0 --- ---local function Loop() --- SetTimeout(2, function () ----- MySQL.Sync.fetchAll('WRONG SQL QUERY', {}) --- --- MySQL.Sync.fetchScalar('SELECT @parameters', { --- ['@parameters'] = 'string' --- }) --- --- executed = executed + 1 --- --- MySQL.Async.fetchAll('SELECT "hello2" as world', {}, function(result) --- received = received + 1 --- end) --- --- if executed % 100 == 0 then --- print(received .. "/" .. executed) --- end --- --- Loop() --- end) ---end --- ---AddEventHandler('onMySQLReady', function () --- Loop() ---end) - -MySQL.ready(function () - print(MySQL.Sync.fetchScalar('SELECT @parameters', { - ['@parameters'] = 1 - })) - - print(MySQL.Sync.fetchScalar('SELECT @parameters', { - ['@parameters'] = 'string' - })) - - MySQL.Async.fetchScalar('SELECT NOW() as world', {}, function(result) - print(result) - end) - - MySQL.Async.execute('SELECT SLEEP(5)', nil, function() - print("1") - end) - MySQL.Async.execute('SELECT SLEEP(4)', nil, function() - print("2") - end) - MySQL.Async.execute('SELECT SLEEP(3)', {}, function() - print("3") - end) - MySQL.Async.execute('SELECT SLEEP(2)', nil, function() - print("4") - end) - MySQL.Async.execute('SELECT SLEEP(1)', nil, function() - print("5") - end) - - print(MySQL.Sync.fetchScalar("SELECT money FROM users WHERE id = 'yolo' ")) - - MySQL.Async.fetchAll("SELECT money FROM users WHERE id = 'yolo' ", {}, function (result) - print(#result) - end) - - print(MySQL.Sync.fetchAll('SELECT "hello1" as world', {})[1].world) - - MySQL.Async.fetchAll('SELECT "hello2" as world', {}, function(result) - print(result[1].world) - end) - - print(MySQL.Sync.fetchScalar('SELECT "hello3" as world', {})) - - MySQL.Async.fetchScalar('SELECT "hello4" as world', {}, function(result) - print(result) - end) - - print(json.encode(MySQL.Sync.fetchScalar('SELECT null', {}))) - - MySQL.Async.fetchScalar('SELECT null', {}, function(result) - print(result) - end) - - MySQL.Sync.fetchAll('WRONG SQL QUERY', {}) -end) diff --git a/mysql-async/lib/MySQL.lua b/mysql-async/lib/MySQL.lua deleted file mode 100644 index f8ae6cf9..00000000 --- a/mysql-async/lib/MySQL.lua +++ /dev/null @@ -1,212 +0,0 @@ -MySQL = { - Async = {}, - Sync = {}, - Threaded = {} -- remove in the next big version -} - -local function safeParameters(params) - if nil == params then - return {[''] = ''} - end - - assert(type(params) == "table", "A table is expected") - assert(params[1] == nil, "Parameters should not be an array, but a map (key / value pair) instead") - - if next(params) == nil then - return {[''] = ''} - end - - return params -end - ---- --- Execute a query with no result required, sync version --- --- @param query --- @param params --- --- @return int Number of rows updated --- -function MySQL.Sync.execute(query, params) - assert(type(query) == "string", "The SQL Query must be a string") - - local res = 0 - local finishedQuery = false - exports['mysql-async']:mysql_execute(query, safeParameters(params), function (result) - res = result - finishedQuery = true - end) - repeat Citizen.Wait(0) until finishedQuery == true - return res -end ---- --- Execute a query and fetch all results in an sync way --- --- @param query --- @param params --- --- @return table Query results --- -function MySQL.Sync.fetchAll(query, params) - assert(type(query) == "string", "The SQL Query must be a string") - - local res = {} - local finishedQuery = false - exports['mysql-async']:mysql_fetch_all(query, safeParameters(params), function (result) - res = result - finishedQuery = true - end) - repeat Citizen.Wait(0) until finishedQuery == true - return res -end - ---- --- Execute a query and fetch the first column of the first row, sync version --- Useful for count function by example --- --- @param query --- @param params --- --- @return mixed Value of the first column in the first row --- -function MySQL.Sync.fetchScalar(query, params) - assert(type(query) == "string", "The SQL Query must be a string") - - local res = '' - local finishedQuery = false - exports['mysql-async']:mysql_fetch_scalar(query, safeParameters(params), function (result) - res = result - finishedQuery = true - end) - repeat Citizen.Wait(0) until finishedQuery == true - return res -end - ---- --- Execute a query and retrieve the last id insert, sync version --- --- @param query --- @param params --- --- @return mixed Value of the last insert id --- -function MySQL.Sync.insert(query, params) - assert(type(query) == "string", "The SQL Query must be a string") - - local res = 0 - local finishedQuery = false - exports['mysql-async']:mysql_insert(query, safeParameters(params), function (result) - res = result - finishedQuery = true - end) - repeat Citizen.Wait(0) until finishedQuery == true - return res -end - ---- --- Execute a List of querys and returns bool true when all are executed successfully --- --- @param querys --- @param params --- --- @return bool if the transaction was successful --- ---function MySQL.Sync.transaction(querys, params) --- assert(type(querys) == "table", "The SQL Query must be a table of strings") --- --- return exports['mysql-async']:mysql_sync_transaction(querys, safeParameters(params)) ---end - ---- --- Execute a query with no result required, async version --- --- @param query --- @param params --- @param func(int) --- -function MySQL.Async.execute(query, params, func) - assert(type(query) == "string", "The SQL Query must be a string") - - exports['mysql-async']:mysql_execute(query, safeParameters(params), func) -end - ---- --- Execute a query and fetch all results in an async way --- --- @param query --- @param params --- @param func(table) --- -function MySQL.Async.fetchAll(query, params, func) - assert(type(query) == "string", "The SQL Query must be a string") - - exports['mysql-async']:mysql_fetch_all(query, safeParameters(params), func) -end - ---- --- Execute a query and fetch the first column of the first row, async version --- Useful for count function by example --- --- @param query --- @param params --- @param func(mixed) --- -function MySQL.Async.fetchScalar(query, params, func) - assert(type(query) == "string", "The SQL Query must be a string") - - exports['mysql-async']:mysql_fetch_scalar(query, safeParameters(params), func) -end - ---- --- Execute a query and retrieve the last id insert, async version --- --- @param query --- @param params --- @param func(string) --- -function MySQL.Async.insert(query, params, func) - assert(type(query) == "string", "The SQL Query must be a string") - - exports['mysql-async']:mysql_insert(query, safeParameters(params), func) -end - ---- --- Execute a List of querys and returns bool true when all are executed successfully --- --- @param querys --- @param params --- @param func(bool) --- ---function MySQL.Async.transaction(querys, params, func) --- assert(type(querys) == "table", "The SQL Query must be a table of strings") --- --- return exports['mysql-async']:mysql_transaction(querys, safeParameters(params), func) ---end - --- --- Remove in the next big update --- -MySQL.Threaded.execute = MySQL.Sync.execute -MySQL.Threaded.fetchAll = MySQL.Sync.fetchAll -MySQL.Threaded.fetchScalar = MySQL.Sync.fetchScalar -MySQL.Threaded.insert = MySQL.Sync.insert - - -local isReady = false -local callbackDictionary = {} - -AddEventHandler('MySQLReady', function () - isReady = true - for i, cb in ipairs(callbackDictionary) do - callbackDictionary[i] = nil - cb() - end -end) - -function MySQL.ready (callback) - if isReady then - callback() - else - table.insert(callbackDictionary, callback) - end -end diff --git a/mysql-async/mysql-async-client.js b/mysql-async/mysql-async-client.js deleted file mode 100644 index db0e98bd..00000000 --- a/mysql-async/mysql-async-client.js +++ /dev/null @@ -1,219 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports) { - -let isNuiActive = false; - -function NuiMessage(msg) { - window.SendNuiMessage(JSON.stringify(msg)); -} - -function NuiCallback(name, callback) { - window.RegisterNuiCallbackType(name); - window.on(`__cfx_nui:${name}`, (data, cb) => { - callback(data); - cb('ok'); - }); -} - -function setNuiActive(boolean = true) { - if (boolean !== isNuiActive) { - if (boolean) { - window.emitNet('mysql-async:request-data'); - } - isNuiActive = boolean; - NuiMessage({ type: 'onToggleShow' }); - window.SetNuiFocus(boolean, boolean); - } -} - -window.RegisterCommand('mysql', () => { - setNuiActive(); -}, true); - -NuiCallback('close-explorer', () => { - setNuiActive(false); -}); - -window.setInterval(() => { - if (isNuiActive) { - window.emitNet('mysql-async:request-data'); - } -}, 300000); - -window.onNet('mysql-async:update-resource-data', (resourceData) => { - let arrayToSortAndMap = []; - const resources = Object.keys(resourceData); - for (let i = 0; i < resources.length; i += 1) { - if (Object.prototype.hasOwnProperty.call(resourceData, resources[i])) { - if (Object.prototype.hasOwnProperty.call(resourceData[resources[i]], 'totalExecutionTime')) { - arrayToSortAndMap.push({ - resource: resources[i], - queryTime: resourceData[resources[i]].totalExecutionTime, - count: resourceData[resources[i]].queryCount, - }); - } - } - } - if (arrayToSortAndMap.length > 0) { - arrayToSortAndMap.sort((a, b) => a.queryTime - b.queryTime); - const len = arrayToSortAndMap.length; - arrayToSortAndMap = arrayToSortAndMap.filter((_, index) => index > len - 31); - arrayToSortAndMap.sort((a, b) => { - const resourceA = a.resource.toLowerCase(); - const resourceB = b.resource.toLowerCase(); - let result = 0; - if (resourceA < resourceB) { - result = -1; - } else if (resourceA > resourceB) { - result = 1; - } - return result; - }); - NuiMessage({ - type: 'onResourceLabels', - resourceLabels: arrayToSortAndMap.map(el => el.resource), - }); - NuiMessage({ - type: 'onResourceData', - resourceData: [ - { - data: arrayToSortAndMap.map(el => el.queryTime), - }, - { - data: arrayToSortAndMap.map(el => ((el.count > 0) ? el.queryTime / el.count : 0)), - }, - { - data: arrayToSortAndMap.map(el => el.count), - }, - ], - }); - } -}); - -window.onNet('mysql-async:update-time-data', (timeData) => { - let timeArray = []; - if (Array.isArray(timeData)) { - const len = timeData.length; - timeArray = timeData.filter((_, index) => index > len - 31); - } - if (timeArray.length > 0) { - NuiMessage({ - type: 'onTimeData', - timeData: [ - { - data: timeArray.map(el => el.totalExecutionTime), - }, - { - data: timeArray.map(el => ((el.queryCount > 0) ? el.totalExecutionTime / el.queryCount - : 0)), - }, - { - data: timeArray.map(el => el.queryCount), - }, - ], - }); - } -}); - -window.onNet('mysql-async:update-slow-queries', (slowQueryData) => { - const slowQueries = slowQueryData.map((el) => { - const element = el; - element.queryTime = Math.round(el.queryTime * 100) / 100; - return element; - }); - NuiMessage({ - type: 'onSlowQueryData', - slowQueries, - }); -}); - - -/***/ }) -/******/ ]); \ No newline at end of file diff --git a/mysql-async/mysql-async.js b/mysql-async/mysql-async.js deleted file mode 100644 index 2a6c37cd..00000000 --- a/mysql-async/mysql-async.js +++ /dev/null @@ -1,14509 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 31); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports) { - -module.exports = require("util"); - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -/* eslint-disable node/no-deprecated-api */ -var buffer = __webpack_require__(41) -var Buffer = buffer.Buffer - -// alternative to using Object.keys for old browsers -function copyProps (src, dst) { - for (var key in src) { - dst[key] = src[key] - } -} -if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { - module.exports = buffer -} else { - // Copy properties from require('buffer') - copyProps(buffer, exports) - exports.Buffer = SafeBuffer -} - -function SafeBuffer (arg, encodingOrOffset, length) { - return Buffer(arg, encodingOrOffset, length) -} - -// Copy static methods from Buffer -copyProps(Buffer, SafeBuffer) - -SafeBuffer.from = function (arg, encodingOrOffset, length) { - if (typeof arg === 'number') { - throw new TypeError('Argument must not be a number') - } - return Buffer(arg, encodingOrOffset, length) -} - -SafeBuffer.alloc = function (size, fill, encoding) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - var buf = Buffer(size) - if (fill !== undefined) { - if (typeof encoding === 'string') { - buf.fill(fill, encoding) - } else { - buf.fill(fill) - } - } else { - buf.fill(0) - } - return buf -} - -SafeBuffer.allocUnsafe = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return Buffer(size) -} - -SafeBuffer.allocUnsafeSlow = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return buffer.SlowBuffer(size) -} - - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -exports.AuthSwitchRequestPacket = __webpack_require__(45); -exports.AuthSwitchResponsePacket = __webpack_require__(46); -exports.ClientAuthenticationPacket = __webpack_require__(47); -exports.ComChangeUserPacket = __webpack_require__(48); -exports.ComPingPacket = __webpack_require__(49); -exports.ComQueryPacket = __webpack_require__(50); -exports.ComQuitPacket = __webpack_require__(51); -exports.ComStatisticsPacket = __webpack_require__(52); -exports.EmptyPacket = __webpack_require__(53); -exports.EofPacket = __webpack_require__(54); -exports.ErrorPacket = __webpack_require__(55); -exports.Field = __webpack_require__(17); -exports.FieldPacket = __webpack_require__(56); -exports.HandshakeInitializationPacket = __webpack_require__(57); -exports.LocalDataFilePacket = __webpack_require__(58); -exports.OkPacket = __webpack_require__(59); -exports.OldPasswordPacket = __webpack_require__(60); -exports.ResultSetHeaderPacket = __webpack_require__(61); -exports.RowDataPacket = __webpack_require__(62); -exports.SSLRequestPacket = __webpack_require__(63); -exports.StatisticsPacket = __webpack_require__(64); -exports.UseOldPasswordPacket = __webpack_require__(65); - - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -var Util = __webpack_require__(0); -var EventEmitter = __webpack_require__(4).EventEmitter; -var Packets = __webpack_require__(2); -var ErrorConstants = __webpack_require__(66); - -// istanbul ignore next: Node.js < 0.10 not covered -var listenerCount = EventEmitter.listenerCount - || function(emitter, type){ return emitter.listeners(type).length; }; - -var LONG_STACK_DELIMITER = '\n --------------------\n'; - -module.exports = Sequence; -Util.inherits(Sequence, EventEmitter); -function Sequence(options, callback) { - if (typeof options === 'function') { - callback = options; - options = {}; - } - - EventEmitter.call(this); - - options = options || {}; - - this._callback = callback; - this._callSite = null; - this._ended = false; - this._timeout = options.timeout; - - // For Timers - this._idleNext = null; - this._idlePrev = null; - this._idleStart = null; - this._idleTimeout = -1; - this._repeat = null; -} - -Sequence.determinePacket = function(byte) { - switch (byte) { - case 0x00: return Packets.OkPacket; - case 0xfe: return Packets.EofPacket; - case 0xff: return Packets.ErrorPacket; - default: return undefined; - } -}; - -Sequence.prototype.hasErrorHandler = function() { - return Boolean(this._callback) || listenerCount(this, 'error') > 1; -}; - -Sequence.prototype._packetToError = function(packet) { - var code = ErrorConstants[packet.errno] || 'UNKNOWN_CODE_PLEASE_REPORT'; - var err = new Error(code + ': ' + packet.message); - err.code = code; - err.errno = packet.errno; - - err.sqlMessage = packet.message; - err.sqlState = packet.sqlState; - - return err; -}; - -Sequence.prototype.end = function(err) { - if (this._ended) { - return; - } - - this._ended = true; - - if (err) { - this._addLongStackTrace(err); - } - - // Without this we are leaking memory. This problem was introduced in - // 8189925374e7ce3819bbe88b64c7b15abac96b16. I suspect that the error object - // causes a cyclic reference that the GC does not detect properly, but I was - // unable to produce a standalone version of this leak. This would be a great - // challenge for somebody interested in difficult problems : )! - this._callSite = null; - - // try...finally for exception safety - try { - if (err) { - this.emit('error', err); - } - } finally { - try { - if (this._callback) { - this._callback.apply(this, arguments); - } - } finally { - this.emit('end'); - } - } -}; - -Sequence.prototype['OkPacket'] = function(packet) { - this.end(null, packet); -}; - -Sequence.prototype['ErrorPacket'] = function(packet) { - this.end(this._packetToError(packet)); -}; - -// Implemented by child classes -Sequence.prototype.start = function() {}; - -Sequence.prototype._addLongStackTrace = function _addLongStackTrace(err) { - var callSiteStack = this._callSite && this._callSite.stack; - - if (!callSiteStack || typeof callSiteStack !== 'string') { - // No recorded call site - return; - } - - if (err.stack.indexOf(LONG_STACK_DELIMITER) !== -1) { - // Error stack already looks long - return; - } - - var index = callSiteStack.indexOf('\n'); - - if (index !== -1) { - // Append recorded call site - err.stack += LONG_STACK_DELIMITER + callSiteStack.substr(index + 1); - } -}; - -Sequence.prototype._onTimeout = function _onTimeout() { - this.emit('timeout'); -}; - - -/***/ }), -/* 4 */ -/***/ (function(module, exports) { - -module.exports = require("events"); - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a duplex stream is just a stream that is both readable and writable. -// Since JS doesn't have multiple prototypal inheritance, this class -// prototypally inherits from Readable, and then parasitically from -// Writable. - - - -/**/ - -var processNextTick = __webpack_require__(11); -/**/ - -/**/ -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - keys.push(key); - }return keys; -}; -/**/ - -module.exports = Duplex; - -/**/ -var util = __webpack_require__(6); -util.inherits = __webpack_require__(7); -/**/ - -var Readable = __webpack_require__(21); -var Writable = __webpack_require__(24); - -util.inherits(Duplex, Readable); - -var keys = objectKeys(Writable.prototype); -for (var v = 0; v < keys.length; v++) { - var method = keys[v]; - if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; -} - -function Duplex(options) { - if (!(this instanceof Duplex)) return new Duplex(options); - - Readable.call(this, options); - Writable.call(this, options); - - if (options && options.readable === false) this.readable = false; - - if (options && options.writable === false) this.writable = false; - - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; - - this.once('end', onend); -} - -// the no-half-open enforcer -function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) return; - - // no more data can be written. - // But allow more writes to happen in this tick. - processNextTick(onEndNT, this); -} - -function onEndNT(self) { - self.end(); -} - -Object.defineProperty(Duplex.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined || this._writableState === undefined) { - return false; - } - return this._readableState.destroyed && this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (this._readableState === undefined || this._writableState === undefined) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - this._writableState.destroyed = value; - } -}); - -Duplex.prototype._destroy = function (err, cb) { - this.push(null); - this.end(); - - processNextTick(cb, err); -}; - -function forEach(xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} - -/***/ }), -/* 6 */ -/***/ (function(module, exports) { - -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. - -function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = Buffer.isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -try { - var util = __webpack_require__(0); - if (typeof util.inherits !== 'function') throw ''; - module.exports = util.inherits; -} catch (e) { - module.exports = __webpack_require__(73); -} - - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -var Crypto = __webpack_require__(15); -var Events = __webpack_require__(4); -var Net = __webpack_require__(33); -var tls = __webpack_require__(34); -var ConnectionConfig = __webpack_require__(9); -var Protocol = __webpack_require__(37); -var SqlString = __webpack_require__(27); -var Query = __webpack_require__(19); -var Util = __webpack_require__(0); - -module.exports = Connection; -Util.inherits(Connection, Events.EventEmitter); -function Connection(options) { - Events.EventEmitter.call(this); - - this.config = options.config; - - this._socket = options.socket; - this._protocol = new Protocol({config: this.config, connection: this}); - this._connectCalled = false; - this.state = 'disconnected'; - this.threadId = null; -} - -function bindToCurrentDomain(callback) { - if (!callback) { - return undefined; - } - - var domain = process.domain; - - return domain - ? domain.bind(callback) - : callback; -} - -Connection.createQuery = function createQuery(sql, values, callback) { - if (sql instanceof Query) { - return sql; - } - - var cb = bindToCurrentDomain(callback); - var options = {}; - - if (typeof sql === 'function') { - cb = bindToCurrentDomain(sql); - return new Query(options, cb); - } - - if (typeof sql === 'object') { - for (var prop in sql) { - options[prop] = sql[prop]; - } - - if (typeof values === 'function') { - cb = bindToCurrentDomain(values); - } else if (values !== undefined) { - options.values = values; - } - - return new Query(options, cb); - } - - options.sql = sql; - options.values = values; - - if (typeof values === 'function') { - cb = bindToCurrentDomain(values); - options.values = undefined; - } - - if (cb === undefined && callback !== undefined) { - throw new TypeError('argument callback must be a function when provided'); - } - - return new Query(options, cb); -}; - -Connection.prototype.connect = function connect(options, callback) { - if (!callback && typeof options === 'function') { - callback = options; - options = {}; - } - - if (!this._connectCalled) { - this._connectCalled = true; - - // Connect either via a UNIX domain socket or a TCP socket. - this._socket = (this.config.socketPath) - ? Net.createConnection(this.config.socketPath) - : Net.createConnection(this.config.port, this.config.host); - - // Connect socket to connection domain - if (Events.usingDomains) { - this._socket.domain = this.domain; - } - - var connection = this; - this._protocol.on('data', function(data) { - connection._socket.write(data); - }); - this._socket.on('data', function(data) { - connection._protocol.write(data); - }); - this._protocol.on('end', function() { - connection._socket.end(); - }); - this._socket.on('end', function() { - connection._protocol.end(); - }); - - this._socket.on('error', this._handleNetworkError.bind(this)); - this._socket.on('connect', this._handleProtocolConnect.bind(this)); - this._protocol.on('handshake', this._handleProtocolHandshake.bind(this)); - this._protocol.on('unhandledError', this._handleProtocolError.bind(this)); - this._protocol.on('drain', this._handleProtocolDrain.bind(this)); - this._protocol.on('end', this._handleProtocolEnd.bind(this)); - this._protocol.on('enqueue', this._handleProtocolEnqueue.bind(this)); - - if (this.config.connectTimeout) { - var handleConnectTimeout = this._handleConnectTimeout.bind(this); - - this._socket.setTimeout(this.config.connectTimeout, handleConnectTimeout); - this._socket.once('connect', function() { - this.setTimeout(0, handleConnectTimeout); - }); - } - } - - this._protocol.handshake(options, bindToCurrentDomain(callback)); -}; - -Connection.prototype.changeUser = function changeUser(options, callback) { - if (!callback && typeof options === 'function') { - callback = options; - options = {}; - } - - this._implyConnect(); - - var charsetNumber = (options.charset) - ? ConnectionConfig.getCharsetNumber(options.charset) - : this.config.charsetNumber; - - return this._protocol.changeUser({ - user : options.user || this.config.user, - password : options.password || this.config.password, - database : options.database || this.config.database, - timeout : options.timeout, - charsetNumber : charsetNumber, - currentConfig : this.config - }, bindToCurrentDomain(callback)); -}; - -Connection.prototype.beginTransaction = function beginTransaction(options, callback) { - if (!callback && typeof options === 'function') { - callback = options; - options = {}; - } - - options = options || {}; - options.sql = 'START TRANSACTION'; - options.values = null; - - return this.query(options, callback); -}; - -Connection.prototype.commit = function commit(options, callback) { - if (!callback && typeof options === 'function') { - callback = options; - options = {}; - } - - options = options || {}; - options.sql = 'COMMIT'; - options.values = null; - - return this.query(options, callback); -}; - -Connection.prototype.rollback = function rollback(options, callback) { - if (!callback && typeof options === 'function') { - callback = options; - options = {}; - } - - options = options || {}; - options.sql = 'ROLLBACK'; - options.values = null; - - return this.query(options, callback); -}; - -Connection.prototype.query = function query(sql, values, cb) { - var query = Connection.createQuery(sql, values, cb); - query._connection = this; - - if (!(typeof sql === 'object' && 'typeCast' in sql)) { - query.typeCast = this.config.typeCast; - } - - if (query.sql) { - query.sql = this.format(query.sql, query.values); - } - - this._implyConnect(); - - return this._protocol._enqueue(query); -}; - -Connection.prototype.ping = function ping(options, callback) { - if (!callback && typeof options === 'function') { - callback = options; - options = {}; - } - - this._implyConnect(); - this._protocol.ping(options, bindToCurrentDomain(callback)); -}; - -Connection.prototype.statistics = function statistics(options, callback) { - if (!callback && typeof options === 'function') { - callback = options; - options = {}; - } - - this._implyConnect(); - this._protocol.stats(options, bindToCurrentDomain(callback)); -}; - -Connection.prototype.end = function end(options, callback) { - var cb = callback; - var opts = options; - - if (!callback && typeof options === 'function') { - cb = options; - opts = null; - } - - // create custom options reference - opts = Object.create(opts || null); - - if (opts.timeout === undefined) { - // default timeout of 30 seconds - opts.timeout = 30000; - } - - this._implyConnect(); - this._protocol.quit(opts, bindToCurrentDomain(cb)); -}; - -Connection.prototype.destroy = function() { - this.state = 'disconnected'; - this._implyConnect(); - this._socket.destroy(); - this._protocol.destroy(); -}; - -Connection.prototype.pause = function() { - this._socket.pause(); - this._protocol.pause(); -}; - -Connection.prototype.resume = function() { - this._socket.resume(); - this._protocol.resume(); -}; - -Connection.prototype.escape = function(value) { - return SqlString.escape(value, false, this.config.timezone); -}; - -Connection.prototype.escapeId = function escapeId(value) { - return SqlString.escapeId(value, false); -}; - -Connection.prototype.format = function(sql, values) { - if (typeof this.config.queryFormat === 'function') { - return this.config.queryFormat.call(this, sql, values, this.config.timezone); - } - return SqlString.format(sql, values, this.config.stringifyObjects, this.config.timezone); -}; - -if (tls.TLSSocket) { - // 0.11+ environment - Connection.prototype._startTLS = function _startTLS(onSecure) { - var connection = this; - var secureContext = tls.createSecureContext({ - ca : this.config.ssl.ca, - cert : this.config.ssl.cert, - ciphers : this.config.ssl.ciphers, - key : this.config.ssl.key, - passphrase : this.config.ssl.passphrase - }); - - // "unpipe" - this._socket.removeAllListeners('data'); - this._protocol.removeAllListeners('data'); - - // socket <-> encrypted - var rejectUnauthorized = this.config.ssl.rejectUnauthorized; - var secureEstablished = false; - var secureSocket = new tls.TLSSocket(this._socket, { - rejectUnauthorized : rejectUnauthorized, - requestCert : true, - secureContext : secureContext, - isServer : false - }); - - // error handler for secure socket - secureSocket.on('_tlsError', function(err) { - if (secureEstablished) { - connection._handleNetworkError(err); - } else { - onSecure(err); - } - }); - - // cleartext <-> protocol - secureSocket.pipe(this._protocol); - this._protocol.on('data', function(data) { - secureSocket.write(data); - }); - - secureSocket.on('secure', function() { - secureEstablished = true; - - onSecure(rejectUnauthorized ? this.ssl.verifyError() : null); - }); - - // start TLS communications - secureSocket._start(); - }; -} else { - // pre-0.11 environment - Connection.prototype._startTLS = function _startTLS(onSecure) { - // before TLS: - // _socket <-> _protocol - // after: - // _socket <-> securePair.encrypted <-> securePair.cleartext <-> _protocol - - var connection = this; - var credentials = Crypto.createCredentials({ - ca : this.config.ssl.ca, - cert : this.config.ssl.cert, - ciphers : this.config.ssl.ciphers, - key : this.config.ssl.key, - passphrase : this.config.ssl.passphrase - }); - - var rejectUnauthorized = this.config.ssl.rejectUnauthorized; - var secureEstablished = false; - var securePair = tls.createSecurePair(credentials, false, true, rejectUnauthorized); - - // error handler for secure pair - securePair.on('error', function(err) { - if (secureEstablished) { - connection._handleNetworkError(err); - } else { - onSecure(err); - } - }); - - // "unpipe" - this._socket.removeAllListeners('data'); - this._protocol.removeAllListeners('data'); - - // socket <-> encrypted - securePair.encrypted.pipe(this._socket); - this._socket.on('data', function(data) { - securePair.encrypted.write(data); - }); - - // cleartext <-> protocol - securePair.cleartext.pipe(this._protocol); - this._protocol.on('data', function(data) { - securePair.cleartext.write(data); - }); - - // secure established - securePair.on('secure', function() { - secureEstablished = true; - - if (!rejectUnauthorized) { - onSecure(); - return; - } - - var verifyError = this.ssl.verifyError(); - var err = verifyError; - - // node.js 0.6 support - if (typeof err === 'string') { - err = new Error(verifyError); - err.code = verifyError; - } - - onSecure(err); - }); - - // node.js 0.8 bug - securePair._cycle = securePair.cycle; - securePair.cycle = function cycle() { - if (this.ssl && this.ssl.error) { - this.error(); - } - - return this._cycle.apply(this, arguments); - }; - }; -} - -Connection.prototype._handleConnectTimeout = function() { - if (this._socket) { - this._socket.setTimeout(0); - this._socket.destroy(); - } - - var err = new Error('connect ETIMEDOUT'); - err.errorno = 'ETIMEDOUT'; - err.code = 'ETIMEDOUT'; - err.syscall = 'connect'; - - this._handleNetworkError(err); -}; - -Connection.prototype._handleNetworkError = function(err) { - this._protocol.handleNetworkError(err); -}; - -Connection.prototype._handleProtocolError = function(err) { - this.state = 'protocol_error'; - this.emit('error', err); -}; - -Connection.prototype._handleProtocolDrain = function() { - this.emit('drain'); -}; - -Connection.prototype._handleProtocolConnect = function() { - this.state = 'connected'; - this.emit('connect'); -}; - -Connection.prototype._handleProtocolHandshake = function _handleProtocolHandshake(packet) { - this.state = 'authenticated'; - this.threadId = packet.threadId; -}; - -Connection.prototype._handleProtocolEnd = function(err) { - this.state = 'disconnected'; - this.emit('end', err); -}; - -Connection.prototype._handleProtocolEnqueue = function _handleProtocolEnqueue(sequence) { - this.emit('enqueue', sequence); -}; - -Connection.prototype._implyConnect = function() { - if (!this._connectCalled) { - this.connect(); - } -}; - - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - -var urlParse = __webpack_require__(35).parse; -var ClientConstants = __webpack_require__(10); -var Charsets = __webpack_require__(16); -var SSLProfiles = null; - -module.exports = ConnectionConfig; -function ConnectionConfig(options) { - if (typeof options === 'string') { - options = ConnectionConfig.parseUrl(options); - } - - this.host = options.host || 'localhost'; - this.port = options.port || 3306; - this.localAddress = options.localAddress; - this.socketPath = options.socketPath; - this.user = options.user || undefined; - this.password = options.password || undefined; - this.database = options.database; - this.connectTimeout = (options.connectTimeout === undefined) - ? (10 * 1000) - : options.connectTimeout; - this.insecureAuth = options.insecureAuth || false; - this.supportBigNumbers = options.supportBigNumbers || false; - this.bigNumberStrings = options.bigNumberStrings || false; - this.dateStrings = options.dateStrings || false; - this.debug = options.debug; - this.trace = options.trace !== false; - this.stringifyObjects = options.stringifyObjects || false; - this.timezone = options.timezone || 'local'; - this.flags = options.flags || ''; - this.queryFormat = options.queryFormat; - this.pool = options.pool || undefined; - this.ssl = (typeof options.ssl === 'string') - ? ConnectionConfig.getSSLProfile(options.ssl) - : (options.ssl || false); - this.multipleStatements = options.multipleStatements || false; - this.typeCast = (options.typeCast === undefined) - ? true - : options.typeCast; - - if (this.timezone[0] === ' ') { - // "+" is a url encoded char for space so it - // gets translated to space when giving a - // connection string.. - this.timezone = '+' + this.timezone.substr(1); - } - - if (this.ssl) { - // Default rejectUnauthorized to true - this.ssl.rejectUnauthorized = this.ssl.rejectUnauthorized !== false; - } - - this.maxPacketSize = 0; - this.charsetNumber = (options.charset) - ? ConnectionConfig.getCharsetNumber(options.charset) - : options.charsetNumber || Charsets.UTF8_GENERAL_CI; - - // Set the client flags - var defaultFlags = ConnectionConfig.getDefaultFlags(options); - this.clientFlags = ConnectionConfig.mergeFlags(defaultFlags, options.flags); -} - -ConnectionConfig.mergeFlags = function mergeFlags(defaultFlags, userFlags) { - var allFlags = ConnectionConfig.parseFlagList(defaultFlags); - var newFlags = ConnectionConfig.parseFlagList(userFlags); - - // Merge the new flags - for (var flag in newFlags) { - if (allFlags[flag] !== false) { - allFlags[flag] = newFlags[flag]; - } - } - - // Build flags - var flags = 0x0; - for (var flag in allFlags) { - if (allFlags[flag]) { - // TODO: Throw here on some future release - flags |= ClientConstants['CLIENT_' + flag] || 0x0; - } - } - - return flags; -}; - -ConnectionConfig.getCharsetNumber = function getCharsetNumber(charset) { - var num = Charsets[charset.toUpperCase()]; - - if (num === undefined) { - throw new TypeError('Unknown charset \'' + charset + '\''); - } - - return num; -}; - -ConnectionConfig.getDefaultFlags = function getDefaultFlags(options) { - var defaultFlags = [ - '-COMPRESS', // Compression protocol *NOT* supported - '-CONNECT_ATTRS', // Does *NOT* send connection attributes in Protocol::HandshakeResponse41 - '+CONNECT_WITH_DB', // One can specify db on connect in Handshake Response Packet - '+FOUND_ROWS', // Send found rows instead of affected rows - '+IGNORE_SIGPIPE', // Don't issue SIGPIPE if network failures - '+IGNORE_SPACE', // Let the parser ignore spaces before '(' - '+LOCAL_FILES', // Can use LOAD DATA LOCAL - '+LONG_FLAG', // Longer flags in Protocol::ColumnDefinition320 - '+LONG_PASSWORD', // Use the improved version of Old Password Authentication - '+MULTI_RESULTS', // Can handle multiple resultsets for COM_QUERY - '+ODBC', // Special handling of ODBC behaviour - '-PLUGIN_AUTH', // Does *NOT* support auth plugins - '+PROTOCOL_41', // Uses the 4.1 protocol - '+PS_MULTI_RESULTS', // Can handle multiple resultsets for COM_STMT_EXECUTE - '+RESERVED', // Unused - '+SECURE_CONNECTION', // Supports Authentication::Native41 - '+TRANSACTIONS' // Expects status flags - ]; - - if (options && options.multipleStatements) { - // May send multiple statements per COM_QUERY and COM_STMT_PREPARE - defaultFlags.push('+MULTI_STATEMENTS'); - } - - return defaultFlags; -}; - -ConnectionConfig.getSSLProfile = function getSSLProfile(name) { - if (!SSLProfiles) { - SSLProfiles = __webpack_require__(36); - } - - var ssl = SSLProfiles[name]; - - if (ssl === undefined) { - throw new TypeError('Unknown SSL profile \'' + name + '\''); - } - - return ssl; -}; - -ConnectionConfig.parseFlagList = function parseFlagList(flagList) { - var allFlags = Object.create(null); - - if (!flagList) { - return allFlags; - } - - var flags = !Array.isArray(flagList) - ? String(flagList || '').toUpperCase().split(/\s*,+\s*/) - : flagList; - - for (var i = 0; i < flags.length; i++) { - var flag = flags[i]; - var offset = 1; - var state = flag[0]; - - if (state === undefined) { - // TODO: throw here on some future release - continue; - } - - if (state !== '-' && state !== '+') { - offset = 0; - state = '+'; - } - - allFlags[flag.substr(offset)] = state === '+'; - } - - return allFlags; -}; - -ConnectionConfig.parseUrl = function(url) { - url = urlParse(url, true); - - var options = { - host : url.hostname, - port : url.port, - database : url.pathname.substr(1) - }; - - if (url.auth) { - var auth = url.auth.split(':'); - options.user = auth.shift(); - options.password = auth.join(':'); - } - - if (url.query) { - for (var key in url.query) { - var value = url.query[key]; - - try { - // Try to parse this as a JSON expression first - options[key] = JSON.parse(value); - } catch (err) { - // Otherwise assume it is a plain string - options[key] = value; - } - } - } - - return options; -}; - - -/***/ }), -/* 10 */ -/***/ (function(module, exports) { - -// Manually extracted from mysql-5.5.23/include/mysql_com.h -exports.CLIENT_LONG_PASSWORD = 1; /* new more secure passwords */ -exports.CLIENT_FOUND_ROWS = 2; /* Found instead of affected rows */ -exports.CLIENT_LONG_FLAG = 4; /* Get all column flags */ -exports.CLIENT_CONNECT_WITH_DB = 8; /* One can specify db on connect */ -exports.CLIENT_NO_SCHEMA = 16; /* Don't allow database.table.column */ -exports.CLIENT_COMPRESS = 32; /* Can use compression protocol */ -exports.CLIENT_ODBC = 64; /* Odbc client */ -exports.CLIENT_LOCAL_FILES = 128; /* Can use LOAD DATA LOCAL */ -exports.CLIENT_IGNORE_SPACE = 256; /* Ignore spaces before '(' */ -exports.CLIENT_PROTOCOL_41 = 512; /* New 4.1 protocol */ -exports.CLIENT_INTERACTIVE = 1024; /* This is an interactive client */ -exports.CLIENT_SSL = 2048; /* Switch to SSL after handshake */ -exports.CLIENT_IGNORE_SIGPIPE = 4096; /* IGNORE sigpipes */ -exports.CLIENT_TRANSACTIONS = 8192; /* Client knows about transactions */ -exports.CLIENT_RESERVED = 16384; /* Old flag for 4.1 protocol */ -exports.CLIENT_SECURE_CONNECTION = 32768; /* New 4.1 authentication */ - -exports.CLIENT_MULTI_STATEMENTS = 65536; /* Enable/disable multi-stmt support */ -exports.CLIENT_MULTI_RESULTS = 131072; /* Enable/disable multi-results */ -exports.CLIENT_PS_MULTI_RESULTS = 262144; /* Multi-results in PS-protocol */ - -exports.CLIENT_PLUGIN_AUTH = 524288; /* Client supports plugin authentication */ - -exports.CLIENT_SSL_VERIFY_SERVER_CERT = 1073741824; -exports.CLIENT_REMEMBER_OPTIONS = 2147483648; - - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -if (!process.version || - process.version.indexOf('v0.') === 0 || - process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { - module.exports = nextTick; -} else { - module.exports = process.nextTick; -} - -function nextTick(fn, arg1, arg2, arg3) { - if (typeof fn !== 'function') { - throw new TypeError('"callback" argument must be a function'); - } - var len = arguments.length; - var args, i; - switch (len) { - case 0: - case 1: - return process.nextTick(fn); - case 2: - return process.nextTick(function afterTickOne() { - fn.call(null, arg1); - }); - case 3: - return process.nextTick(function afterTickTwo() { - fn.call(null, arg1, arg2); - }); - case 4: - return process.nextTick(function afterTickThree() { - fn.call(null, arg1, arg2, arg3); - }); - default: - args = new Array(len - 1); - i = 0; - while (i < args.length) { - args[i++] = arguments[i]; - } - return process.nextTick(function afterTick() { - fn.apply(null, args); - }); - } -} - - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -var Classes = Object.create(null); - -/** - * Create a new Connection instance. - * @param {object|string} config Configuration or connection string for new MySQL connection - * @return {Connection} A new MySQL connection - * @public - */ -exports.createConnection = function createConnection(config) { - var Connection = loadClass('Connection'); - var ConnectionConfig = loadClass('ConnectionConfig'); - - return new Connection({config: new ConnectionConfig(config)}); -}; - -/** - * Create a new Pool instance. - * @param {object|string} config Configuration or connection string for new MySQL connections - * @return {Pool} A new MySQL pool - * @public - */ -exports.createPool = function createPool(config) { - var Pool = loadClass('Pool'); - var PoolConfig = loadClass('PoolConfig'); - - return new Pool({config: new PoolConfig(config)}); -}; - -/** - * Create a new PoolCluster instance. - * @param {object} [config] Configuration for pool cluster - * @return {PoolCluster} New MySQL pool cluster - * @public - */ -exports.createPoolCluster = function createPoolCluster(config) { - var PoolCluster = loadClass('PoolCluster'); - - return new PoolCluster(config); -}; - -/** - * Create a new Query instance. - * @param {string} sql The SQL for the query - * @param {array} [values] Any values to insert into placeholders in sql - * @param {function} [callback] The callback to use when query is complete - * @return {Query} New query object - * @public - */ -exports.createQuery = function createQuery(sql, values, callback) { - var Connection = loadClass('Connection'); - - return Connection.createQuery(sql, values, callback); -}; - -/** - * Escape a value for SQL. - * @param {*} value The value to escape - * @param {boolean} [stringifyObjects=false] Setting if objects should be stringified - * @param {string} [timeZone=local] Setting for time zone to use for Date conversion - * @return {string} Escaped string value - * @public - */ -exports.escape = function escape(value, stringifyObjects, timeZone) { - var SqlString = loadClass('SqlString'); - - return SqlString.escape(value, stringifyObjects, timeZone); -}; - -/** - * Escape an identifier for SQL. - * @param {*} value The value to escape - * @param {boolean} [forbidQualified=false] Setting to treat '.' as part of identifier - * @return {string} Escaped string value - * @public - */ -exports.escapeId = function escapeId(value, forbidQualified) { - var SqlString = loadClass('SqlString'); - - return SqlString.escapeId(value, forbidQualified); -}; - -/** - * Format SQL and replacement values into a SQL string. - * @param {string} sql The SQL for the query - * @param {array} [values] Any values to insert into placeholders in sql - * @param {boolean} [stringifyObjects=false] Setting if objects should be stringified - * @param {string} [timeZone=local] Setting for time zone to use for Date conversion - * @return {string} Formatted SQL string - * @public - */ -exports.format = function format(sql, values, stringifyObjects, timeZone) { - var SqlString = loadClass('SqlString'); - - return SqlString.format(sql, values, stringifyObjects, timeZone); -}; - -/** - * Wrap raw SQL strings from escape overriding. - * @param {string} sql The raw SQL - * @return {object} Wrapped object - * @public - */ -exports.raw = function raw(sql) { - var SqlString = loadClass('SqlString'); - - return SqlString.raw(sql); -}; - -/** - * The type constants. - * @public - */ -Object.defineProperty(exports, 'Types', { - get: loadClass.bind(null, 'Types') -}); - -/** - * Load the given class. - * @param {string} className Name of class to default - * @return {function|object} Class constructor or exports - * @private - */ -function loadClass(className) { - var Class = Classes[className]; - - if (Class !== undefined) { - return Class; - } - - // This uses a switch for static require analysis - switch (className) { - case 'Connection': - Class = __webpack_require__(8); - break; - case 'ConnectionConfig': - Class = __webpack_require__(9); - break; - case 'Pool': - Class = __webpack_require__(28); - break; - case 'PoolCluster': - Class = __webpack_require__(84); - break; - case 'PoolConfig': - Class = __webpack_require__(29); - break; - case 'SqlString': - Class = __webpack_require__(27); - break; - case 'Types': - Class = __webpack_require__(13); - break; - default: - throw new Error('Cannot find class \'' + className + '\''); - } - - // Store to prevent invoking require() - Classes[className] = Class; - - return Class; -} - - -/***/ }), -/* 13 */ -/***/ (function(module, exports) { - -// Manually extracted from mysql-5.7.9/include/mysql.h.pp -// some more info here: http://dev.mysql.com/doc/refman/5.5/en/c-api-prepared-statement-type-codes.html -exports.DECIMAL = 0x00; // aka DECIMAL (http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html) -exports.TINY = 0x01; // aka TINYINT, 1 byte -exports.SHORT = 0x02; // aka SMALLINT, 2 bytes -exports.LONG = 0x03; // aka INT, 4 bytes -exports.FLOAT = 0x04; // aka FLOAT, 4-8 bytes -exports.DOUBLE = 0x05; // aka DOUBLE, 8 bytes -exports.NULL = 0x06; // NULL (used for prepared statements, I think) -exports.TIMESTAMP = 0x07; // aka TIMESTAMP -exports.LONGLONG = 0x08; // aka BIGINT, 8 bytes -exports.INT24 = 0x09; // aka MEDIUMINT, 3 bytes -exports.DATE = 0x0a; // aka DATE -exports.TIME = 0x0b; // aka TIME -exports.DATETIME = 0x0c; // aka DATETIME -exports.YEAR = 0x0d; // aka YEAR, 1 byte (don't ask) -exports.NEWDATE = 0x0e; // aka ? -exports.VARCHAR = 0x0f; // aka VARCHAR (?) -exports.BIT = 0x10; // aka BIT, 1-8 byte -exports.TIMESTAMP2 = 0x11; // aka TIMESTAMP with fractional seconds -exports.DATETIME2 = 0x12; // aka DATETIME with fractional seconds -exports.TIME2 = 0x13; // aka TIME with fractional seconds -exports.JSON = 0xf5; // aka JSON -exports.NEWDECIMAL = 0xf6; // aka DECIMAL -exports.ENUM = 0xf7; // aka ENUM -exports.SET = 0xf8; // aka SET -exports.TINY_BLOB = 0xf9; // aka TINYBLOB, TINYTEXT -exports.MEDIUM_BLOB = 0xfa; // aka MEDIUMBLOB, MEDIUMTEXT -exports.LONG_BLOB = 0xfb; // aka LONGBLOG, LONGTEXT -exports.BLOB = 0xfc; // aka BLOB, TEXT -exports.VAR_STRING = 0xfd; // aka VARCHAR, VARBINARY -exports.STRING = 0xfe; // aka CHAR, BINARY -exports.GEOMETRY = 0xff; // aka GEOMETRY - - -/***/ }), -/* 14 */ -/***/ (function(module, exports) { - -module.exports = require("stream"); - -/***/ }), -/* 15 */ -/***/ (function(module, exports) { - -module.exports = require("crypto"); - -/***/ }), -/* 16 */ -/***/ (function(module, exports) { - -exports.BIG5_CHINESE_CI = 1; -exports.LATIN2_CZECH_CS = 2; -exports.DEC8_SWEDISH_CI = 3; -exports.CP850_GENERAL_CI = 4; -exports.LATIN1_GERMAN1_CI = 5; -exports.HP8_ENGLISH_CI = 6; -exports.KOI8R_GENERAL_CI = 7; -exports.LATIN1_SWEDISH_CI = 8; -exports.LATIN2_GENERAL_CI = 9; -exports.SWE7_SWEDISH_CI = 10; -exports.ASCII_GENERAL_CI = 11; -exports.UJIS_JAPANESE_CI = 12; -exports.SJIS_JAPANESE_CI = 13; -exports.CP1251_BULGARIAN_CI = 14; -exports.LATIN1_DANISH_CI = 15; -exports.HEBREW_GENERAL_CI = 16; -exports.TIS620_THAI_CI = 18; -exports.EUCKR_KOREAN_CI = 19; -exports.LATIN7_ESTONIAN_CS = 20; -exports.LATIN2_HUNGARIAN_CI = 21; -exports.KOI8U_GENERAL_CI = 22; -exports.CP1251_UKRAINIAN_CI = 23; -exports.GB2312_CHINESE_CI = 24; -exports.GREEK_GENERAL_CI = 25; -exports.CP1250_GENERAL_CI = 26; -exports.LATIN2_CROATIAN_CI = 27; -exports.GBK_CHINESE_CI = 28; -exports.CP1257_LITHUANIAN_CI = 29; -exports.LATIN5_TURKISH_CI = 30; -exports.LATIN1_GERMAN2_CI = 31; -exports.ARMSCII8_GENERAL_CI = 32; -exports.UTF8_GENERAL_CI = 33; -exports.CP1250_CZECH_CS = 34; -exports.UCS2_GENERAL_CI = 35; -exports.CP866_GENERAL_CI = 36; -exports.KEYBCS2_GENERAL_CI = 37; -exports.MACCE_GENERAL_CI = 38; -exports.MACROMAN_GENERAL_CI = 39; -exports.CP852_GENERAL_CI = 40; -exports.LATIN7_GENERAL_CI = 41; -exports.LATIN7_GENERAL_CS = 42; -exports.MACCE_BIN = 43; -exports.CP1250_CROATIAN_CI = 44; -exports.UTF8MB4_GENERAL_CI = 45; -exports.UTF8MB4_BIN = 46; -exports.LATIN1_BIN = 47; -exports.LATIN1_GENERAL_CI = 48; -exports.LATIN1_GENERAL_CS = 49; -exports.CP1251_BIN = 50; -exports.CP1251_GENERAL_CI = 51; -exports.CP1251_GENERAL_CS = 52; -exports.MACROMAN_BIN = 53; -exports.UTF16_GENERAL_CI = 54; -exports.UTF16_BIN = 55; -exports.UTF16LE_GENERAL_CI = 56; -exports.CP1256_GENERAL_CI = 57; -exports.CP1257_BIN = 58; -exports.CP1257_GENERAL_CI = 59; -exports.UTF32_GENERAL_CI = 60; -exports.UTF32_BIN = 61; -exports.UTF16LE_BIN = 62; -exports.BINARY = 63; -exports.ARMSCII8_BIN = 64; -exports.ASCII_BIN = 65; -exports.CP1250_BIN = 66; -exports.CP1256_BIN = 67; -exports.CP866_BIN = 68; -exports.DEC8_BIN = 69; -exports.GREEK_BIN = 70; -exports.HEBREW_BIN = 71; -exports.HP8_BIN = 72; -exports.KEYBCS2_BIN = 73; -exports.KOI8R_BIN = 74; -exports.KOI8U_BIN = 75; -exports.LATIN2_BIN = 77; -exports.LATIN5_BIN = 78; -exports.LATIN7_BIN = 79; -exports.CP850_BIN = 80; -exports.CP852_BIN = 81; -exports.SWE7_BIN = 82; -exports.UTF8_BIN = 83; -exports.BIG5_BIN = 84; -exports.EUCKR_BIN = 85; -exports.GB2312_BIN = 86; -exports.GBK_BIN = 87; -exports.SJIS_BIN = 88; -exports.TIS620_BIN = 89; -exports.UCS2_BIN = 90; -exports.UJIS_BIN = 91; -exports.GEOSTD8_GENERAL_CI = 92; -exports.GEOSTD8_BIN = 93; -exports.LATIN1_SPANISH_CI = 94; -exports.CP932_JAPANESE_CI = 95; -exports.CP932_BIN = 96; -exports.EUCJPMS_JAPANESE_CI = 97; -exports.EUCJPMS_BIN = 98; -exports.CP1250_POLISH_CI = 99; -exports.UTF16_UNICODE_CI = 101; -exports.UTF16_ICELANDIC_CI = 102; -exports.UTF16_LATVIAN_CI = 103; -exports.UTF16_ROMANIAN_CI = 104; -exports.UTF16_SLOVENIAN_CI = 105; -exports.UTF16_POLISH_CI = 106; -exports.UTF16_ESTONIAN_CI = 107; -exports.UTF16_SPANISH_CI = 108; -exports.UTF16_SWEDISH_CI = 109; -exports.UTF16_TURKISH_CI = 110; -exports.UTF16_CZECH_CI = 111; -exports.UTF16_DANISH_CI = 112; -exports.UTF16_LITHUANIAN_CI = 113; -exports.UTF16_SLOVAK_CI = 114; -exports.UTF16_SPANISH2_CI = 115; -exports.UTF16_ROMAN_CI = 116; -exports.UTF16_PERSIAN_CI = 117; -exports.UTF16_ESPERANTO_CI = 118; -exports.UTF16_HUNGARIAN_CI = 119; -exports.UTF16_SINHALA_CI = 120; -exports.UTF16_GERMAN2_CI = 121; -exports.UTF16_CROATIAN_MYSQL561_CI = 122; -exports.UTF16_UNICODE_520_CI = 123; -exports.UTF16_VIETNAMESE_CI = 124; -exports.UCS2_UNICODE_CI = 128; -exports.UCS2_ICELANDIC_CI = 129; -exports.UCS2_LATVIAN_CI = 130; -exports.UCS2_ROMANIAN_CI = 131; -exports.UCS2_SLOVENIAN_CI = 132; -exports.UCS2_POLISH_CI = 133; -exports.UCS2_ESTONIAN_CI = 134; -exports.UCS2_SPANISH_CI = 135; -exports.UCS2_SWEDISH_CI = 136; -exports.UCS2_TURKISH_CI = 137; -exports.UCS2_CZECH_CI = 138; -exports.UCS2_DANISH_CI = 139; -exports.UCS2_LITHUANIAN_CI = 140; -exports.UCS2_SLOVAK_CI = 141; -exports.UCS2_SPANISH2_CI = 142; -exports.UCS2_ROMAN_CI = 143; -exports.UCS2_PERSIAN_CI = 144; -exports.UCS2_ESPERANTO_CI = 145; -exports.UCS2_HUNGARIAN_CI = 146; -exports.UCS2_SINHALA_CI = 147; -exports.UCS2_GERMAN2_CI = 148; -exports.UCS2_CROATIAN_MYSQL561_CI = 149; -exports.UCS2_UNICODE_520_CI = 150; -exports.UCS2_VIETNAMESE_CI = 151; -exports.UCS2_GENERAL_MYSQL500_CI = 159; -exports.UTF32_UNICODE_CI = 160; -exports.UTF32_ICELANDIC_CI = 161; -exports.UTF32_LATVIAN_CI = 162; -exports.UTF32_ROMANIAN_CI = 163; -exports.UTF32_SLOVENIAN_CI = 164; -exports.UTF32_POLISH_CI = 165; -exports.UTF32_ESTONIAN_CI = 166; -exports.UTF32_SPANISH_CI = 167; -exports.UTF32_SWEDISH_CI = 168; -exports.UTF32_TURKISH_CI = 169; -exports.UTF32_CZECH_CI = 170; -exports.UTF32_DANISH_CI = 171; -exports.UTF32_LITHUANIAN_CI = 172; -exports.UTF32_SLOVAK_CI = 173; -exports.UTF32_SPANISH2_CI = 174; -exports.UTF32_ROMAN_CI = 175; -exports.UTF32_PERSIAN_CI = 176; -exports.UTF32_ESPERANTO_CI = 177; -exports.UTF32_HUNGARIAN_CI = 178; -exports.UTF32_SINHALA_CI = 179; -exports.UTF32_GERMAN2_CI = 180; -exports.UTF32_CROATIAN_MYSQL561_CI = 181; -exports.UTF32_UNICODE_520_CI = 182; -exports.UTF32_VIETNAMESE_CI = 183; -exports.UTF8_UNICODE_CI = 192; -exports.UTF8_ICELANDIC_CI = 193; -exports.UTF8_LATVIAN_CI = 194; -exports.UTF8_ROMANIAN_CI = 195; -exports.UTF8_SLOVENIAN_CI = 196; -exports.UTF8_POLISH_CI = 197; -exports.UTF8_ESTONIAN_CI = 198; -exports.UTF8_SPANISH_CI = 199; -exports.UTF8_SWEDISH_CI = 200; -exports.UTF8_TURKISH_CI = 201; -exports.UTF8_CZECH_CI = 202; -exports.UTF8_DANISH_CI = 203; -exports.UTF8_LITHUANIAN_CI = 204; -exports.UTF8_SLOVAK_CI = 205; -exports.UTF8_SPANISH2_CI = 206; -exports.UTF8_ROMAN_CI = 207; -exports.UTF8_PERSIAN_CI = 208; -exports.UTF8_ESPERANTO_CI = 209; -exports.UTF8_HUNGARIAN_CI = 210; -exports.UTF8_SINHALA_CI = 211; -exports.UTF8_GERMAN2_CI = 212; -exports.UTF8_CROATIAN_MYSQL561_CI = 213; -exports.UTF8_UNICODE_520_CI = 214; -exports.UTF8_VIETNAMESE_CI = 215; -exports.UTF8_GENERAL_MYSQL500_CI = 223; -exports.UTF8MB4_UNICODE_CI = 224; -exports.UTF8MB4_ICELANDIC_CI = 225; -exports.UTF8MB4_LATVIAN_CI = 226; -exports.UTF8MB4_ROMANIAN_CI = 227; -exports.UTF8MB4_SLOVENIAN_CI = 228; -exports.UTF8MB4_POLISH_CI = 229; -exports.UTF8MB4_ESTONIAN_CI = 230; -exports.UTF8MB4_SPANISH_CI = 231; -exports.UTF8MB4_SWEDISH_CI = 232; -exports.UTF8MB4_TURKISH_CI = 233; -exports.UTF8MB4_CZECH_CI = 234; -exports.UTF8MB4_DANISH_CI = 235; -exports.UTF8MB4_LITHUANIAN_CI = 236; -exports.UTF8MB4_SLOVAK_CI = 237; -exports.UTF8MB4_SPANISH2_CI = 238; -exports.UTF8MB4_ROMAN_CI = 239; -exports.UTF8MB4_PERSIAN_CI = 240; -exports.UTF8MB4_ESPERANTO_CI = 241; -exports.UTF8MB4_HUNGARIAN_CI = 242; -exports.UTF8MB4_SINHALA_CI = 243; -exports.UTF8MB4_GERMAN2_CI = 244; -exports.UTF8MB4_CROATIAN_MYSQL561_CI = 245; -exports.UTF8MB4_UNICODE_520_CI = 246; -exports.UTF8MB4_VIETNAMESE_CI = 247; -exports.UTF8_GENERAL50_CI = 253; - -// short aliases -exports.ARMSCII8 = exports.ARMSCII8_GENERAL_CI; -exports.ASCII = exports.ASCII_GENERAL_CI; -exports.BIG5 = exports.BIG5_CHINESE_CI; -exports.BINARY = exports.BINARY; -exports.CP1250 = exports.CP1250_GENERAL_CI; -exports.CP1251 = exports.CP1251_GENERAL_CI; -exports.CP1256 = exports.CP1256_GENERAL_CI; -exports.CP1257 = exports.CP1257_GENERAL_CI; -exports.CP866 = exports.CP866_GENERAL_CI; -exports.CP850 = exports.CP850_GENERAL_CI; -exports.CP852 = exports.CP852_GENERAL_CI; -exports.CP932 = exports.CP932_JAPANESE_CI; -exports.DEC8 = exports.DEC8_SWEDISH_CI; -exports.EUCJPMS = exports.EUCJPMS_JAPANESE_CI; -exports.EUCKR = exports.EUCKR_KOREAN_CI; -exports.GB2312 = exports.GB2312_CHINESE_CI; -exports.GBK = exports.GBK_CHINESE_CI; -exports.GEOSTD8 = exports.GEOSTD8_GENERAL_CI; -exports.GREEK = exports.GREEK_GENERAL_CI; -exports.HEBREW = exports.HEBREW_GENERAL_CI; -exports.HP8 = exports.HP8_ENGLISH_CI; -exports.KEYBCS2 = exports.KEYBCS2_GENERAL_CI; -exports.KOI8R = exports.KOI8R_GENERAL_CI; -exports.KOI8U = exports.KOI8U_GENERAL_CI; -exports.LATIN1 = exports.LATIN1_SWEDISH_CI; -exports.LATIN2 = exports.LATIN2_GENERAL_CI; -exports.LATIN5 = exports.LATIN5_TURKISH_CI; -exports.LATIN7 = exports.LATIN7_GENERAL_CI; -exports.MACCE = exports.MACCE_GENERAL_CI; -exports.MACROMAN = exports.MACROMAN_GENERAL_CI; -exports.SJIS = exports.SJIS_JAPANESE_CI; -exports.SWE7 = exports.SWE7_SWEDISH_CI; -exports.TIS620 = exports.TIS620_THAI_CI; -exports.UCS2 = exports.UCS2_GENERAL_CI; -exports.UJIS = exports.UJIS_JAPANESE_CI; -exports.UTF16 = exports.UTF16_GENERAL_CI; -exports.UTF16LE = exports.UTF16LE_GENERAL_CI; -exports.UTF8 = exports.UTF8_GENERAL_CI; -exports.UTF8MB4 = exports.UTF8MB4_GENERAL_CI; -exports.UTF32 = exports.UTF32_GENERAL_CI; - - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - -var Types = __webpack_require__(13); - -module.exports = Field; -function Field(options) { - options = options || {}; - - this.parser = options.parser; - this.packet = options.packet; - this.db = options.packet.db; - this.table = options.packet.table; - this.name = options.packet.name; - this.type = typeToString(options.packet.type); - this.length = options.packet.length; -} - -Field.prototype.string = function () { - return this.parser.parseLengthCodedString(); -}; - -Field.prototype.buffer = function () { - return this.parser.parseLengthCodedBuffer(); -}; - -Field.prototype.geometry = function () { - return this.parser.parseGeometryValue(); -}; - -function typeToString(t) { - for (var k in Types) { - if (Types[k] === t) return k; - } - - return undefined; -} - - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - -var Buffer = __webpack_require__(1).Buffer; -var Crypto = __webpack_require__(15); -var Auth = exports; - -function sha1(msg) { - var hash = Crypto.createHash('sha1'); - hash.update(msg, 'binary'); - return hash.digest('binary'); -} -Auth.sha1 = sha1; - -function xor(a, b) { - a = Buffer.from(a, 'binary'); - b = Buffer.from(b, 'binary'); - var result = Buffer.allocUnsafe(a.length); - for (var i = 0; i < a.length; i++) { - result[i] = (a[i] ^ b[i]); - } - return result; -} -Auth.xor = xor; - -Auth.token = function(password, scramble) { - if (!password) { - return Buffer.alloc(0); - } - - // password must be in binary format, not utf8 - var stage1 = sha1((Buffer.from(password, 'utf8')).toString('binary')); - var stage2 = sha1(stage1); - var stage3 = sha1(scramble.toString('binary') + stage2); - return xor(stage3, stage1); -}; - -// This is a port of sql/password.c:hash_password which needs to be used for -// pre-4.1 passwords. -Auth.hashPassword = function(password) { - var nr = [0x5030, 0x5735], - add = 7, - nr2 = [0x1234, 0x5671], - result = Buffer.alloc(8); - - if (typeof password === 'string'){ - password = Buffer.from(password); - } - - for (var i = 0; i < password.length; i++) { - var c = password[i]; - if (c === 32 || c === 9) { - // skip space in password - continue; - } - - // nr^= (((nr & 63)+add)*c)+ (nr << 8); - // nr = xor(nr, add(mul(add(and(nr, 63), add), c), shl(nr, 8))) - nr = this.xor32(nr, this.add32(this.mul32(this.add32(this.and32(nr, [0, 63]), [0, add]), [0, c]), this.shl32(nr, 8))); - - // nr2+=(nr2 << 8) ^ nr; - // nr2 = add(nr2, xor(shl(nr2, 8), nr)) - nr2 = this.add32(nr2, this.xor32(this.shl32(nr2, 8), nr)); - - // add+=tmp; - add += c; - } - - this.int31Write(result, nr, 0); - this.int31Write(result, nr2, 4); - - return result; -}; - -Auth.randomInit = function(seed1, seed2) { - return { - max_value : 0x3FFFFFFF, - max_value_dbl : 0x3FFFFFFF, - seed1 : seed1 % 0x3FFFFFFF, - seed2 : seed2 % 0x3FFFFFFF - }; -}; - -Auth.myRnd = function(r){ - r.seed1 = (r.seed1 * 3 + r.seed2) % r.max_value; - r.seed2 = (r.seed1 + r.seed2 + 33) % r.max_value; - - return r.seed1 / r.max_value_dbl; -}; - -Auth.scramble323 = function(message, password) { - var to = Buffer.allocUnsafe(8), - hashPass = this.hashPassword(password), - hashMessage = this.hashPassword(message.slice(0, 8)), - seed1 = this.int32Read(hashPass, 0) ^ this.int32Read(hashMessage, 0), - seed2 = this.int32Read(hashPass, 4) ^ this.int32Read(hashMessage, 4), - r = this.randomInit(seed1, seed2); - - for (var i = 0; i < 8; i++){ - to[i] = Math.floor(this.myRnd(r) * 31) + 64; - } - var extra = (Math.floor(this.myRnd(r) * 31)); - - for (var i = 0; i < 8; i++){ - to[i] ^= extra; - } - - return to; -}; - -Auth.xor32 = function(a, b){ - return [a[0] ^ b[0], a[1] ^ b[1]]; -}; - -Auth.add32 = function(a, b){ - var w1 = a[1] + b[1], - w2 = a[0] + b[0] + ((w1 & 0xFFFF0000) >> 16); - - return [w2 & 0xFFFF, w1 & 0xFFFF]; -}; - -Auth.mul32 = function(a, b){ - // based on this example of multiplying 32b ints using 16b - // http://www.dsprelated.com/showmessage/89790/1.php - var w1 = a[1] * b[1], - w2 = (((a[1] * b[1]) >> 16) & 0xFFFF) + ((a[0] * b[1]) & 0xFFFF) + (a[1] * b[0] & 0xFFFF); - - return [w2 & 0xFFFF, w1 & 0xFFFF]; -}; - -Auth.and32 = function(a, b){ - return [a[0] & b[0], a[1] & b[1]]; -}; - -Auth.shl32 = function(a, b){ - // assume b is 16 or less - var w1 = a[1] << b, - w2 = (a[0] << b) | ((w1 & 0xFFFF0000) >> 16); - - return [w2 & 0xFFFF, w1 & 0xFFFF]; -}; - -Auth.int31Write = function(buffer, number, offset) { - buffer[offset] = (number[0] >> 8) & 0x7F; - buffer[offset + 1] = (number[0]) & 0xFF; - buffer[offset + 2] = (number[1] >> 8) & 0xFF; - buffer[offset + 3] = (number[1]) & 0xFF; -}; - -Auth.int32Read = function(buffer, offset){ - return (buffer[offset] << 24) - + (buffer[offset + 1] << 16) - + (buffer[offset + 2] << 8) - + (buffer[offset + 3]); -}; - - -/***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { - -var Sequence = __webpack_require__(3); -var Util = __webpack_require__(0); -var Packets = __webpack_require__(2); -var ResultSet = __webpack_require__(69); -var ServerStatus = __webpack_require__(70); -var fs = __webpack_require__(20); -var Readable = __webpack_require__(71); - -module.exports = Query; -Util.inherits(Query, Sequence); -function Query(options, callback) { - Sequence.call(this, options, callback); - - this.sql = options.sql; - this.values = options.values; - this.typeCast = (options.typeCast === undefined) - ? true - : options.typeCast; - this.nestTables = options.nestTables || false; - - this._resultSet = null; - this._results = []; - this._fields = []; - this._index = 0; - this._loadError = null; -} - -Query.prototype.start = function() { - this.emit('packet', new Packets.ComQueryPacket(this.sql)); -}; - -Query.prototype.determinePacket = function determinePacket(byte, parser) { - var resultSet = this._resultSet; - - if (!resultSet) { - switch (byte) { - case 0x00: return Packets.OkPacket; - case 0xff: return Packets.ErrorPacket; - default: return Packets.ResultSetHeaderPacket; - } - } - - if (resultSet.eofPackets.length === 0) { - return (resultSet.fieldPackets.length < resultSet.resultSetHeaderPacket.fieldCount) - ? Packets.FieldPacket - : Packets.EofPacket; - } - - if (byte === 0xff) { - return Packets.ErrorPacket; - } - - if (byte === 0xfe && parser.packetLength() < 9) { - return Packets.EofPacket; - } - - return Packets.RowDataPacket; -}; - -Query.prototype['OkPacket'] = function(packet) { - // try...finally for exception safety - try { - if (!this._callback) { - this.emit('result', packet, this._index); - } else { - this._results.push(packet); - this._fields.push(undefined); - } - } finally { - this._index++; - this._resultSet = null; - this._handleFinalResultPacket(packet); - } -}; - -Query.prototype['ErrorPacket'] = function(packet) { - var err = this._packetToError(packet); - - var results = (this._results.length > 0) - ? this._results - : undefined; - - var fields = (this._fields.length > 0) - ? this._fields - : undefined; - - err.index = this._index; - err.sql = this.sql; - - this.end(err, results, fields); -}; - -Query.prototype['ResultSetHeaderPacket'] = function(packet) { - if (packet.fieldCount === null) { - this._sendLocalDataFile(packet.extra); - } else { - this._resultSet = new ResultSet(packet); - } -}; - -Query.prototype['FieldPacket'] = function(packet) { - this._resultSet.fieldPackets.push(packet); -}; - -Query.prototype['EofPacket'] = function(packet) { - this._resultSet.eofPackets.push(packet); - - if (this._resultSet.eofPackets.length === 1 && !this._callback) { - this.emit('fields', this._resultSet.fieldPackets, this._index); - } - - if (this._resultSet.eofPackets.length !== 2) { - return; - } - - if (this._callback) { - this._results.push(this._resultSet.rows); - this._fields.push(this._resultSet.fieldPackets); - } - - this._index++; - this._resultSet = null; - this._handleFinalResultPacket(packet); -}; - -Query.prototype._handleFinalResultPacket = function(packet) { - if (packet.serverStatus & ServerStatus.SERVER_MORE_RESULTS_EXISTS) { - return; - } - - var results = (this._results.length > 1) - ? this._results - : this._results[0]; - - var fields = (this._fields.length > 1) - ? this._fields - : this._fields[0]; - - this.end(this._loadError, results, fields); -}; - -Query.prototype['RowDataPacket'] = function(packet, parser, connection) { - packet.parse(parser, this._resultSet.fieldPackets, this.typeCast, this.nestTables, connection); - - if (this._callback) { - this._resultSet.rows.push(packet); - } else { - this.emit('result', packet, this._index); - } -}; - -Query.prototype._sendLocalDataFile = function(path) { - var self = this; - var localStream = fs.createReadStream(path, { - flag : 'r', - encoding : null, - autoClose : true - }); - - this.on('pause', function () { - localStream.pause(); - }); - - this.on('resume', function () { - localStream.resume(); - }); - - localStream.on('data', function (data) { - self.emit('packet', new Packets.LocalDataFilePacket(data)); - }); - - localStream.on('error', function (err) { - self._loadError = err; - localStream.emit('end'); - }); - - localStream.on('end', function () { - self.emit('packet', new Packets.EmptyPacket()); - }); -}; - -Query.prototype.stream = function(options) { - var self = this, - stream; - - options = options || {}; - options.objectMode = true; - stream = new Readable(options); - - stream._read = function() { - self._connection && self._connection.resume(); - }; - - stream.once('end', function() { - process.nextTick(function () { - stream.emit('close'); - }); - }); - - this.on('result', function(row, i) { - if (!stream.push(row)) self._connection.pause(); - stream.emit('result', row, i); // replicate old emitter - }); - - this.on('error', function(err) { - stream.emit('error', err); // Pass on any errors - }); - - this.on('end', function() { - stream.push(null); // pushing null, indicating EOF - }); - - this.on('fields', function(fields, i) { - stream.emit('fields', fields, i); // replicate old emitter - }); - - return stream; -}; - - -/***/ }), -/* 20 */ -/***/ (function(module, exports) { - -module.exports = require("fs"); - -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - - - -/**/ - -var processNextTick = __webpack_require__(11); -/**/ - -module.exports = Readable; - -/**/ -var isArray = __webpack_require__(72); -/**/ - -/**/ -var Duplex; -/**/ - -Readable.ReadableState = ReadableState; - -/**/ -var EE = __webpack_require__(4).EventEmitter; - -var EElistenerCount = function (emitter, type) { - return emitter.listeners(type).length; -}; -/**/ - -/**/ -var Stream = __webpack_require__(22); -/**/ - -// TODO(bmeurer): Change this back to const once hole checks are -// properly optimized away early in Ignition+TurboFan. -/**/ -var Buffer = __webpack_require__(1).Buffer; -var OurUint8Array = global.Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} -/**/ - -/**/ -var util = __webpack_require__(6); -util.inherits = __webpack_require__(7); -/**/ - -/**/ -var debugUtil = __webpack_require__(0); -var debug = void 0; -if (debugUtil && debugUtil.debuglog) { - debug = debugUtil.debuglog('stream'); -} else { - debug = function () {}; -} -/**/ - -var BufferList = __webpack_require__(74); -var destroyImpl = __webpack_require__(23); -var StringDecoder; - -util.inherits(Readable, Stream); - -var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; - -function prependListener(emitter, event, fn) { - // Sadly this is not cacheable as some libraries bundle their own - // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') { - return emitter.prependListener(event, fn); - } else { - // This is a hack to make sure that our error handler is attached before any - // userland ones. NEVER DO THIS. This is here only because this code needs - // to continue to work with older versions of Node.js that do not include - // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; - } -} - -function ReadableState(options, stream) { - Duplex = Duplex || __webpack_require__(5); - - options = options || {}; - - // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; - - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; - - // the point at which it stops calling _read() to fill the buffer - // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - - // A linked list is used to store data chunks instead of an array because the - // linked list can remove elements from the beginning faster than - // array.shift() - this.buffer = new BufferList(); - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; - - // a flag to be able to tell if the event 'readable'/'data' is emitted - // immediately, or on a later tick. We set this to true at first, because - // any actions that shouldn't happen until "later" should generally also - // not happen before the first read call. - this.sync = true; - - // whenever we return null, then we set a flag to say - // that we're awaiting a 'readable' event emission. - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; - this.resumeScheduled = false; - - // has it been destroyed - this.destroyed = false; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; - - // if true, a maybeReadMore has been scheduled - this.readingMore = false; - - this.decoder = null; - this.encoding = null; - if (options.encoding) { - if (!StringDecoder) StringDecoder = __webpack_require__(25).StringDecoder; - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; - } -} - -function Readable(options) { - Duplex = Duplex || __webpack_require__(5); - - if (!(this instanceof Readable)) return new Readable(options); - - this._readableState = new ReadableState(options, this); - - // legacy - this.readable = true; - - if (options) { - if (typeof options.read === 'function') this._read = options.read; - - if (typeof options.destroy === 'function') this._destroy = options.destroy; - } - - Stream.call(this); -} - -Object.defineProperty(Readable.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined) { - return false; - } - return this._readableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._readableState) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - } -}); - -Readable.prototype.destroy = destroyImpl.destroy; -Readable.prototype._undestroy = destroyImpl.undestroy; -Readable.prototype._destroy = function (err, cb) { - this.push(null); - cb(err); -}; - -// Manually shove something into the read() buffer. -// This returns true if the highWaterMark has not been hit yet, -// similar to how Writable.write() returns true if you should -// write() some more. -Readable.prototype.push = function (chunk, encoding) { - var state = this._readableState; - var skipChunkCheck; - - if (!state.objectMode) { - if (typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = Buffer.from(chunk, encoding); - encoding = ''; - } - skipChunkCheck = true; - } - } else { - skipChunkCheck = true; - } - - return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -}; - -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function (chunk) { - return readableAddChunk(this, chunk, null, true, false); -}; - -function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { - var state = stream._readableState; - if (chunk === null) { - state.reading = false; - onEofChunk(stream, state); - } else { - var er; - if (!skipChunkCheck) er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (addToFront) { - if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); - } else if (state.ended) { - stream.emit('error', new Error('stream.push() after EOF')); - } else { - state.reading = false; - if (state.decoder && !encoding) { - chunk = state.decoder.write(chunk); - if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); - } else { - addChunk(stream, state, chunk, false); - } - } - } else if (!addToFront) { - state.reading = false; - } - } - - return needMoreData(state); -} - -function addChunk(stream, state, chunk, addToFront) { - if (state.flowing && state.length === 0 && !state.sync) { - stream.emit('data', chunk); - stream.read(0); - } else { - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - - if (state.needReadable) emitReadable(stream); - } - maybeReadMore(stream, state); -} - -function chunkInvalid(state, chunk) { - var er; - if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - return er; -} - -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); -} - -Readable.prototype.isPaused = function () { - return this._readableState.flowing === false; -}; - -// backwards compatibility. -Readable.prototype.setEncoding = function (enc) { - if (!StringDecoder) StringDecoder = __webpack_require__(25).StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; - return this; -}; - -// Don't raise the hwm > 8MB -var MAX_HWM = 0x800000; -function computeNewHighWaterMark(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - // Get the next highest power of 2 to prevent increasing hwm excessively in - // tiny amounts - n--; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - n++; - } - return n; -} - -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function howMuchToRead(n, state) { - if (n <= 0 || state.length === 0 && state.ended) return 0; - if (state.objectMode) return 1; - if (n !== n) { - // Only flow one buffer at a time - if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } - // If we're asking for more than the current hwm, then raise the hwm. - if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; - // Don't have enough - if (!state.ended) { - state.needReadable = true; - return 0; - } - return state.length; -} - -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function (n) { - debug('read', n); - n = parseInt(n, 10); - var state = this._readableState; - var nOrig = n; - - if (n !== 0) state.emittedReadable = false; - - // if we're doing read(0) to trigger a readable event, but we - // already have a bunch of data in the buffer, then just trigger - // the 'readable' event and move on. - if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); - return null; - } - - n = howMuchToRead(n, state); - - // if we've ended, and we're now clear, then finish it up. - if (n === 0 && state.ended) { - if (state.length === 0) endReadable(this); - return null; - } - - // All the actual chunk generation logic needs to be - // *below* the call to _read. The reason is that in certain - // synthetic stream cases, such as passthrough streams, _read - // may be a completely synchronous operation which may change - // the state of the read buffer, providing enough data when - // before there was *not* enough. - // - // So, the steps are: - // 1. Figure out what the state of things will be after we do - // a read from the buffer. - // - // 2. If that resulting state will trigger a _read, then call _read. - // Note that this may be asynchronous, or synchronous. Yes, it is - // deeply ugly to write APIs this way, but that still doesn't mean - // that the Readable class should behave improperly, as streams are - // designed to be sync/async agnostic. - // Take note if the _read call is sync or async (ie, if the read call - // has returned yet), so that we know whether or not it's safe to emit - // 'readable' etc. - // - // 3. Actually pull the requested chunks out of the buffer and return. - - // if we need a readable event, then we need to do some reading. - var doRead = state.needReadable; - debug('need readable', doRead); - - // if we currently have less than the highWaterMark, then also read some - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug('length less than watermark', doRead); - } - - // however, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - if (state.ended || state.reading) { - doRead = false; - debug('reading or ended', doRead); - } else if (doRead) { - debug('do read'); - state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) state.needReadable = true; - // call internal read method - this._read(state.highWaterMark); - state.sync = false; - // If _read pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - if (!state.reading) n = howMuchToRead(nOrig, state); - } - - var ret; - if (n > 0) ret = fromList(n, state);else ret = null; - - if (ret === null) { - state.needReadable = true; - n = 0; - } else { - state.length -= n; - } - - if (state.length === 0) { - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (!state.ended) state.needReadable = true; - - // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended) endReadable(this); - } - - if (ret !== null) this.emit('data', ret); - - return ret; -}; - -function onEofChunk(stream, state) { - if (state.ended) return; - if (state.decoder) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } - } - state.ended = true; - - // emit 'readable' now to make sure it gets picked up. - emitReadable(stream); -} - -// Don't emit readable right away in sync mode, because this can trigger -// another read() call => stack overflow. This way, it might trigger -// a nextTick recursion warning, but that's not so bad. -function emitReadable(stream) { - var state = stream._readableState; - state.needReadable = false; - if (!state.emittedReadable) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; - if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); - } -} - -function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); -} - -// at this point, the user has presumably seen the 'readable' event, -// and called read() to consume some data. that may have triggered -// in turn another _read(n) call, in which case reading = true if -// it's in progress. -// However, if we're not ended, or reading, and the length < hwm, -// then go ahead and try to read some more preemptively. -function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - processNextTick(maybeReadMore_, stream, state); - } -} - -function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { - debug('maybeReadMore read 0'); - stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break;else len = state.length; - } - state.readingMore = false; -} - -// abstract method. to be overridden in specific implementation classes. -// call cb(er, data) where data is <= n in length. -// for virtual (non-string, non-buffer) streams, "length" is somewhat -// arbitrary, and perhaps not very meaningful. -Readable.prototype._read = function (n) { - this.emit('error', new Error('_read() is not implemented')); -}; - -Readable.prototype.pipe = function (dest, pipeOpts) { - var src = this; - var state = this._readableState; - - switch (state.pipesCount) { - case 0: - state.pipes = dest; - break; - case 1: - state.pipes = [state.pipes, dest]; - break; - default: - state.pipes.push(dest); - break; - } - state.pipesCount += 1; - debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - - var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; - - var endFn = doEnd ? onend : unpipe; - if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); - - dest.on('unpipe', onunpipe); - function onunpipe(readable, unpipeInfo) { - debug('onunpipe'); - if (readable === src) { - if (unpipeInfo && unpipeInfo.hasUnpiped === false) { - unpipeInfo.hasUnpiped = true; - cleanup(); - } - } - } - - function onend() { - debug('onend'); - dest.end(); - } - - // when the dest drains, it reduces the awaitDrain counter - // on the source. This would be more elegant with a .once() - // handler in flow(), but adding and removing repeatedly is - // too slow. - var ondrain = pipeOnDrain(src); - dest.on('drain', ondrain); - - var cleanedUp = false; - function cleanup() { - debug('cleanup'); - // cleanup event handlers once the pipe is broken - dest.removeListener('close', onclose); - dest.removeListener('finish', onfinish); - dest.removeListener('drain', ondrain); - dest.removeListener('error', onerror); - dest.removeListener('unpipe', onunpipe); - src.removeListener('end', onend); - src.removeListener('end', unpipe); - src.removeListener('data', ondata); - - cleanedUp = true; - - // if the reader is waiting for a drain event from this - // specific writer, then it would cause it to never start - // flowing again. - // So, if this is awaiting a drain, then we just call it now. - // If we don't know, then assume that we are waiting for one. - if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); - } - - // If the user pushes more data while we're writing to dest then we'll end up - // in ondata again. However, we only want to increase awaitDrain once because - // dest will only emit one 'drain' event for the multiple writes. - // => Introduce a guard on increasing awaitDrain. - var increasedAwaitDrain = false; - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - increasedAwaitDrain = false; - var ret = dest.write(chunk); - if (false === ret && !increasedAwaitDrain) { - // If the user unpiped during `dest.write()`, it is possible - // to get stuck in a permanently paused state if that write - // also returned false. - // => Check whether `dest` is still a piping destination. - if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', src._readableState.awaitDrain); - src._readableState.awaitDrain++; - increasedAwaitDrain = true; - } - src.pause(); - } - } - - // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - function onerror(er) { - debug('onerror', er); - unpipe(); - dest.removeListener('error', onerror); - if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); - } - - // Make sure our error handler is attached before userland ones. - prependListener(dest, 'error', onerror); - - // Both close and finish should trigger unpipe, but only once. - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); - } - dest.once('close', onclose); - function onfinish() { - debug('onfinish'); - dest.removeListener('close', onclose); - unpipe(); - } - dest.once('finish', onfinish); - - function unpipe() { - debug('unpipe'); - src.unpipe(dest); - } - - // tell the dest that it's being piped to - dest.emit('pipe', src); - - // start the flow if it hasn't been started already. - if (!state.flowing) { - debug('pipe resume'); - src.resume(); - } - - return dest; -}; - -function pipeOnDrain(src) { - return function () { - var state = src._readableState; - debug('pipeOnDrain', state.awaitDrain); - if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { - state.flowing = true; - flow(src); - } - }; -} - -Readable.prototype.unpipe = function (dest) { - var state = this._readableState; - var unpipeInfo = { hasUnpiped: false }; - - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) return this; - - // just one destination. most common case. - if (state.pipesCount === 1) { - // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) return this; - - if (!dest) dest = state.pipes; - - // got a match. - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - if (dest) dest.emit('unpipe', this, unpipeInfo); - return this; - } - - // slow case. multiple pipe destinations. - - if (!dest) { - // remove all. - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - - for (var i = 0; i < len; i++) { - dests[i].emit('unpipe', this, unpipeInfo); - }return this; - } - - // try to find the right one. - var index = indexOf(state.pipes, dest); - if (index === -1) return this; - - state.pipes.splice(index, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) state.pipes = state.pipes[0]; - - dest.emit('unpipe', this, unpipeInfo); - - return this; -}; - -// set up data events if they are asked for -// Ensure readable listeners eventually get something -Readable.prototype.on = function (ev, fn) { - var res = Stream.prototype.on.call(this, ev, fn); - - if (ev === 'data') { - // Start flowing on next tick if stream isn't explicitly paused - if (this._readableState.flowing !== false) this.resume(); - } else if (ev === 'readable') { - var state = this._readableState; - if (!state.endEmitted && !state.readableListening) { - state.readableListening = state.needReadable = true; - state.emittedReadable = false; - if (!state.reading) { - processNextTick(nReadingNextTick, this); - } else if (state.length) { - emitReadable(this); - } - } - } - - return res; -}; -Readable.prototype.addListener = Readable.prototype.on; - -function nReadingNextTick(self) { - debug('readable nexttick read 0'); - self.read(0); -} - -// pause() and resume() are remnants of the legacy readable stream API -// If the user uses them, then switch into old mode. -Readable.prototype.resume = function () { - var state = this._readableState; - if (!state.flowing) { - debug('resume'); - state.flowing = true; - resume(this, state); - } - return this; -}; - -function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - processNextTick(resume_, stream, state); - } -} - -function resume_(stream, state) { - if (!state.reading) { - debug('resume read 0'); - stream.read(0); - } - - state.resumeScheduled = false; - state.awaitDrain = 0; - stream.emit('resume'); - flow(stream); - if (state.flowing && !state.reading) stream.read(0); -} - -Readable.prototype.pause = function () { - debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { - debug('pause'); - this._readableState.flowing = false; - this.emit('pause'); - } - return this; -}; - -function flow(stream) { - var state = stream._readableState; - debug('flow', state.flowing); - while (state.flowing && stream.read() !== null) {} -} - -// wrap an old-style stream as the async data source. -// This is *not* part of the readable stream interface. -// It is an ugly unfortunate mess of history. -Readable.prototype.wrap = function (stream) { - var state = this._readableState; - var paused = false; - - var self = this; - stream.on('end', function () { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) self.push(chunk); - } - - self.push(null); - }); - - stream.on('data', function (chunk) { - debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); - - // don't skip over falsy values in objectMode - if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - - var ret = self.push(chunk); - if (!ret) { - paused = true; - stream.pause(); - } - }); - - // proxy all the other methods. - // important when wrapping filters and duplexes. - for (var i in stream) { - if (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function (method) { - return function () { - return stream[method].apply(stream, arguments); - }; - }(i); - } - } - - // proxy certain important events. - for (var n = 0; n < kProxyEvents.length; n++) { - stream.on(kProxyEvents[n], self.emit.bind(self, kProxyEvents[n])); - } - - // when we try to consume some more bytes, simply unpause the - // underlying stream. - self._read = function (n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); - } - }; - - return self; -}; - -// exposed for testing purposes only. -Readable._fromList = fromList; - -// Pluck off n bytes from an array of buffers. -// Length is the combined lengths of all the buffers in the list. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromList(n, state) { - // nothing buffered - if (state.length === 0) return null; - - var ret; - if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { - // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); - state.buffer.clear(); - } else { - // read part of list - ret = fromListPartial(n, state.buffer, state.decoder); - } - - return ret; -} - -// Extracts only enough buffered data to satisfy the amount requested. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromListPartial(n, list, hasStrings) { - var ret; - if (n < list.head.data.length) { - // slice is the same for buffers and strings - ret = list.head.data.slice(0, n); - list.head.data = list.head.data.slice(n); - } else if (n === list.head.data.length) { - // first chunk is a perfect match - ret = list.shift(); - } else { - // result spans more than one buffer - ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); - } - return ret; -} - -// Copies a specified amount of characters from the list of buffered data -// chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBufferString(n, list) { - var p = list.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = str.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -// Copies a specified amount of bytes from the list of buffered data chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBuffer(n, list) { - var ret = Buffer.allocUnsafe(n); - var p = list.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = buf.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -function endReadable(stream) { - var state = stream._readableState; - - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); - - if (!state.endEmitted) { - state.ended = true; - processNextTick(endReadableNT, state, stream); - } -} - -function endReadableNT(state, stream) { - // Check that we didn't get one last unshift. - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - } -} - -function forEach(xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} - -function indexOf(xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(14); - - -/***/ }), -/* 23 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/**/ - -var processNextTick = __webpack_require__(11); -/**/ - -// undocumented cb() API, needed for core, not for public API -function destroy(err, cb) { - var _this = this; - - var readableDestroyed = this._readableState && this._readableState.destroyed; - var writableDestroyed = this._writableState && this._writableState.destroyed; - - if (readableDestroyed || writableDestroyed) { - if (cb) { - cb(err); - } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { - processNextTick(emitErrorNT, this, err); - } - return; - } - - // we set destroyed to true before firing error callbacks in order - // to make it re-entrance safe in case destroy() is called within callbacks - - if (this._readableState) { - this._readableState.destroyed = true; - } - - // if this is a duplex stream mark the writable part as destroyed as well - if (this._writableState) { - this._writableState.destroyed = true; - } - - this._destroy(err || null, function (err) { - if (!cb && err) { - processNextTick(emitErrorNT, _this, err); - if (_this._writableState) { - _this._writableState.errorEmitted = true; - } - } else if (cb) { - cb(err); - } - }); -} - -function undestroy() { - if (this._readableState) { - this._readableState.destroyed = false; - this._readableState.reading = false; - this._readableState.ended = false; - this._readableState.endEmitted = false; - } - - if (this._writableState) { - this._writableState.destroyed = false; - this._writableState.ended = false; - this._writableState.ending = false; - this._writableState.finished = false; - this._writableState.errorEmitted = false; - } -} - -function emitErrorNT(self, err) { - self.emit('error', err); -} - -module.exports = { - destroy: destroy, - undestroy: undestroy -}; - -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// A bit simpler than readable streams. -// Implement an async ._write(chunk, encoding, cb), and it'll handle all -// the drain event emission and buffering. - - - -/**/ - -var processNextTick = __webpack_require__(11); -/**/ - -module.exports = Writable; - -/* */ -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; - this.next = null; -} - -// It seems a linked list but it is not -// there will be only 2 of these for each stream -function CorkedRequest(state) { - var _this = this; - - this.next = null; - this.entry = null; - this.finish = function () { - onCorkedFinish(_this, state); - }; -} -/* */ - -/**/ -var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; -/**/ - -/**/ -var Duplex; -/**/ - -Writable.WritableState = WritableState; - -/**/ -var util = __webpack_require__(6); -util.inherits = __webpack_require__(7); -/**/ - -/**/ -var internalUtil = { - deprecate: __webpack_require__(75) -}; -/**/ - -/**/ -var Stream = __webpack_require__(22); -/**/ - -/**/ -var Buffer = __webpack_require__(1).Buffer; -var OurUint8Array = global.Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} -/**/ - -var destroyImpl = __webpack_require__(23); - -util.inherits(Writable, Stream); - -function nop() {} - -function WritableState(options, stream) { - Duplex = Duplex || __webpack_require__(5); - - options = options || {}; - - // object stream flag to indicate whether or not this stream - // contains buffers or objects. - this.objectMode = !!options.objectMode; - - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; - - // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - - // if _final has been called - this.finalCalled = false; - - // drain event flag. - this.needDrain = false; - // at the start of calling end() - this.ending = false; - // when end() has been called, and returned - this.ended = false; - // when 'finish' is emitted - this.finished = false; - - // has it been destroyed - this.destroyed = false; - - // should we decode strings into buffers before passing to _write? - // this is here so that some node-core streams can optimize string - // handling at a lower level. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // not an actual buffer we keep track of, but a measurement - // of how much we're waiting to get pushed to some underlying - // socket or file. - this.length = 0; - - // a flag to see when we're in the middle of a write. - this.writing = false; - - // when true all writes will be buffered until .uncork() call - this.corked = 0; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // a flag to know if we're processing previously buffered items, which - // may call the _write() callback in the same tick, so that we don't - // end up in an overlapped onwrite situation. - this.bufferProcessing = false; - - // the callback that's passed to _write(chunk,cb) - this.onwrite = function (er) { - onwrite(stream, er); - }; - - // the callback that the user supplies to write(chunk,encoding,cb) - this.writecb = null; - - // the amount that is being written when _write is called. - this.writelen = 0; - - this.bufferedRequest = null; - this.lastBufferedRequest = null; - - // number of pending user-supplied write callbacks - // this must be 0 before 'finish' can be emitted - this.pendingcb = 0; - - // emit prefinish if the only thing we're waiting for is _write cbs - // This is relevant for synchronous Transform streams - this.prefinished = false; - - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; - - // count buffered requests - this.bufferedRequestCount = 0; - - // allocate the first CorkedRequest, there is always - // one allocated and free to use, and we maintain at most two - this.corkedRequestsFree = new CorkedRequest(this); -} - -WritableState.prototype.getBuffer = function getBuffer() { - var current = this.bufferedRequest; - var out = []; - while (current) { - out.push(current); - current = current.next; - } - return out; -}; - -(function () { - try { - Object.defineProperty(WritableState.prototype, 'buffer', { - get: internalUtil.deprecate(function () { - return this.getBuffer(); - }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') - }); - } catch (_) {} -})(); - -// Test _writableState for inheritance to account for Duplex streams, -// whose prototype chain only points to Readable. -var realHasInstance; -if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { - realHasInstance = Function.prototype[Symbol.hasInstance]; - Object.defineProperty(Writable, Symbol.hasInstance, { - value: function (object) { - if (realHasInstance.call(this, object)) return true; - - return object && object._writableState instanceof WritableState; - } - }); -} else { - realHasInstance = function (object) { - return object instanceof this; - }; -} - -function Writable(options) { - Duplex = Duplex || __webpack_require__(5); - - // Writable ctor is applied to Duplexes, too. - // `realHasInstance` is necessary because using plain `instanceof` - // would return false, as no `_writableState` property is attached. - - // Trying to use the custom `instanceof` for Writable here will also break the - // Node.js LazyTransform implementation, which has a non-trivial getter for - // `_writableState` that would lead to infinite recursion. - if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { - return new Writable(options); - } - - this._writableState = new WritableState(options, this); - - // legacy. - this.writable = true; - - if (options) { - if (typeof options.write === 'function') this._write = options.write; - - if (typeof options.writev === 'function') this._writev = options.writev; - - if (typeof options.destroy === 'function') this._destroy = options.destroy; - - if (typeof options.final === 'function') this._final = options.final; - } - - Stream.call(this); -} - -// Otherwise people can pipe Writable streams, which is just wrong. -Writable.prototype.pipe = function () { - this.emit('error', new Error('Cannot pipe, not readable')); -}; - -function writeAfterEnd(stream, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - processNextTick(cb, er); -} - -// Checks that a user-supplied chunk is valid, especially for the particular -// mode the stream is in. Currently this means that `null` is never accepted -// and undefined/non-string values are only allowed in object mode. -function validChunk(stream, state, chunk, cb) { - var valid = true; - var er = false; - - if (chunk === null) { - er = new TypeError('May not write null values to stream'); - } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - if (er) { - stream.emit('error', er); - processNextTick(cb, er); - valid = false; - } - return valid; -} - -Writable.prototype.write = function (chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - var isBuf = _isUint8Array(chunk) && !state.objectMode; - - if (isBuf && !Buffer.isBuffer(chunk)) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - - if (typeof cb !== 'function') cb = nop; - - if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); - } - - return ret; -}; - -Writable.prototype.cork = function () { - var state = this._writableState; - - state.corked++; -}; - -Writable.prototype.uncork = function () { - var state = this._writableState; - - if (state.corked) { - state.corked--; - - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); - } -}; - -Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { - // node::ParseEncoding() requires lower case. - if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); - this._writableState.defaultEncoding = encoding; - return this; -}; - -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = Buffer.from(chunk, encoding); - } - return chunk; -} - -// if we're already writing something, then just put this -// in the queue, and wait our turn. Otherwise, call _write -// If we return false, then we need a drain event, so set that flag. -function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { - if (!isBuf) { - var newChunk = decodeChunk(state, chunk, encoding); - if (chunk !== newChunk) { - isBuf = true; - encoding = 'buffer'; - chunk = newChunk; - } - } - var len = state.objectMode ? 1 : chunk.length; - - state.length += len; - - var ret = state.length < state.highWaterMark; - // we must ensure that previous needDrain will not be reset to false. - if (!ret) state.needDrain = true; - - if (state.writing || state.corked) { - var last = state.lastBufferedRequest; - state.lastBufferedRequest = { - chunk: chunk, - encoding: encoding, - isBuf: isBuf, - callback: cb, - next: null - }; - if (last) { - last.next = state.lastBufferedRequest; - } else { - state.bufferedRequest = state.lastBufferedRequest; - } - state.bufferedRequestCount += 1; - } else { - doWrite(stream, state, false, len, chunk, encoding, cb); - } - - return ret; -} - -function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); - state.sync = false; -} - -function onwriteError(stream, state, sync, er, cb) { - --state.pendingcb; - - if (sync) { - // defer the callback if we are being called synchronously - // to avoid piling up things on the stack - processNextTick(cb, er); - // this can emit finish, and it will always happen - // after error - processNextTick(finishMaybe, stream, state); - stream._writableState.errorEmitted = true; - stream.emit('error', er); - } else { - // the caller expect this to happen before if - // it is async - cb(er); - stream._writableState.errorEmitted = true; - stream.emit('error', er); - // this can emit finish, but finish must - // always follow error - finishMaybe(stream, state); - } -} - -function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; -} - -function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; - - onwriteStateUpdate(state); - - if (er) onwriteError(stream, state, sync, er, cb);else { - // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(state); - - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { - clearBuffer(stream, state); - } - - if (sync) { - /**/ - asyncWrite(afterWrite, stream, state, finished, cb); - /**/ - } else { - afterWrite(stream, state, finished, cb); - } - } -} - -function afterWrite(stream, state, finished, cb) { - if (!finished) onwriteDrain(stream, state); - state.pendingcb--; - cb(); - finishMaybe(stream, state); -} - -// Must force callback to be called on nextTick, so that we don't -// emit 'drain' before the write() consumer gets the 'false' return -// value, and has a chance to attach a 'drain' listener. -function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } -} - -// if there's something in the buffer waiting, then process it -function clearBuffer(stream, state) { - state.bufferProcessing = true; - var entry = state.bufferedRequest; - - if (stream._writev && entry && entry.next) { - // Fast case, write everything using _writev() - var l = state.bufferedRequestCount; - var buffer = new Array(l); - var holder = state.corkedRequestsFree; - holder.entry = entry; - - var count = 0; - var allBuffers = true; - while (entry) { - buffer[count] = entry; - if (!entry.isBuf) allBuffers = false; - entry = entry.next; - count += 1; - } - buffer.allBuffers = allBuffers; - - doWrite(stream, state, true, state.length, buffer, '', holder.finish); - - // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite - state.pendingcb++; - state.lastBufferedRequest = null; - if (holder.next) { - state.corkedRequestsFree = holder.next; - holder.next = null; - } else { - state.corkedRequestsFree = new CorkedRequest(state); - } - } else { - // Slow case, write chunks one-by-one - while (entry) { - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - - doWrite(stream, state, false, len, chunk, encoding, cb); - entry = entry.next; - // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - if (state.writing) { - break; - } - } - - if (entry === null) state.lastBufferedRequest = null; - } - - state.bufferedRequestCount = 0; - state.bufferedRequest = entry; - state.bufferProcessing = false; -} - -Writable.prototype._write = function (chunk, encoding, cb) { - cb(new Error('_write() is not implemented')); -}; - -Writable.prototype._writev = null; - -Writable.prototype.end = function (chunk, encoding, cb) { - var state = this._writableState; - - if (typeof chunk === 'function') { - cb = chunk; - chunk = null; - encoding = null; - } else if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); - - // .end() fully uncorks - if (state.corked) { - state.corked = 1; - this.uncork(); - } - - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) endWritable(this, state, cb); -}; - -function needFinish(state) { - return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; -} -function callFinal(stream, state) { - stream._final(function (err) { - state.pendingcb--; - if (err) { - stream.emit('error', err); - } - state.prefinished = true; - stream.emit('prefinish'); - finishMaybe(stream, state); - }); -} -function prefinish(stream, state) { - if (!state.prefinished && !state.finalCalled) { - if (typeof stream._final === 'function') { - state.pendingcb++; - state.finalCalled = true; - processNextTick(callFinal, stream, state); - } else { - state.prefinished = true; - stream.emit('prefinish'); - } - } -} - -function finishMaybe(stream, state) { - var need = needFinish(state); - if (need) { - prefinish(stream, state); - if (state.pendingcb === 0) { - state.finished = true; - stream.emit('finish'); - } - } - return need; -} - -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) processNextTick(cb);else stream.once('finish', cb); - } - state.ended = true; - stream.writable = false; -} - -function onCorkedFinish(corkReq, state, err) { - var entry = corkReq.entry; - corkReq.entry = null; - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; - } - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = corkReq; - } else { - state.corkedRequestsFree = corkReq; - } -} - -Object.defineProperty(Writable.prototype, 'destroyed', { - get: function () { - if (this._writableState === undefined) { - return false; - } - return this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._writableState) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._writableState.destroyed = value; - } -}); - -Writable.prototype.destroy = destroyImpl.destroy; -Writable.prototype._undestroy = destroyImpl.undestroy; -Writable.prototype._destroy = function (err, cb) { - this.end(); - cb(err); -}; - -/***/ }), -/* 25 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Buffer = __webpack_require__(1).Buffer; - -var isEncoding = Buffer.isEncoding || function (encoding) { - encoding = '' + encoding; - switch (encoding && encoding.toLowerCase()) { - case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': - return true; - default: - return false; - } -}; - -function _normalizeEncoding(enc) { - if (!enc) return 'utf8'; - var retried; - while (true) { - switch (enc) { - case 'utf8': - case 'utf-8': - return 'utf8'; - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return 'utf16le'; - case 'latin1': - case 'binary': - return 'latin1'; - case 'base64': - case 'ascii': - case 'hex': - return enc; - default: - if (retried) return; // undefined - enc = ('' + enc).toLowerCase(); - retried = true; - } - } -}; - -// Do not cache `Buffer.isEncoding` when checking encoding names as some -// modules monkey-patch it to support additional encodings -function normalizeEncoding(enc) { - var nenc = _normalizeEncoding(enc); - if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); - return nenc || enc; -} - -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. -exports.StringDecoder = StringDecoder; -function StringDecoder(encoding) { - this.encoding = normalizeEncoding(encoding); - var nb; - switch (this.encoding) { - case 'utf16le': - this.text = utf16Text; - this.end = utf16End; - nb = 4; - break; - case 'utf8': - this.fillLast = utf8FillLast; - nb = 4; - break; - case 'base64': - this.text = base64Text; - this.end = base64End; - nb = 3; - break; - default: - this.write = simpleWrite; - this.end = simpleEnd; - return; - } - this.lastNeed = 0; - this.lastTotal = 0; - this.lastChar = Buffer.allocUnsafe(nb); -} - -StringDecoder.prototype.write = function (buf) { - if (buf.length === 0) return ''; - var r; - var i; - if (this.lastNeed) { - r = this.fillLast(buf); - if (r === undefined) return ''; - i = this.lastNeed; - this.lastNeed = 0; - } else { - i = 0; - } - if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); - return r || ''; -}; - -StringDecoder.prototype.end = utf8End; - -// Returns only complete characters in a Buffer -StringDecoder.prototype.text = utf8Text; - -// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer -StringDecoder.prototype.fillLast = function (buf) { - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); - this.lastNeed -= buf.length; -}; - -// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a -// continuation byte. -function utf8CheckByte(byte) { - if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; - return -1; -} - -// Checks at most 3 bytes at the end of a Buffer in order to detect an -// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) -// needed to complete the UTF-8 character (if applicable) are returned. -function utf8CheckIncomplete(self, buf, i) { - var j = buf.length - 1; - if (j < i) return 0; - var nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 1; - return nb; - } - if (--j < i) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 2; - return nb; - } - if (--j < i) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) { - if (nb === 2) nb = 0;else self.lastNeed = nb - 3; - } - return nb; - } - return 0; -} - -// Validates as many continuation bytes for a multi-byte UTF-8 character as -// needed or are available. If we see a non-continuation byte where we expect -// one, we "replace" the validated continuation bytes we've seen so far with -// UTF-8 replacement characters ('\ufffd'), to match v8's UTF-8 decoding -// behavior. The continuation byte check is included three times in the case -// where all of the continuation bytes for a character exist in the same buffer. -// It is also done this way as a slight performance increase instead of using a -// loop. -function utf8CheckExtraBytes(self, buf, p) { - if ((buf[0] & 0xC0) !== 0x80) { - self.lastNeed = 0; - return '\ufffd'.repeat(p); - } - if (self.lastNeed > 1 && buf.length > 1) { - if ((buf[1] & 0xC0) !== 0x80) { - self.lastNeed = 1; - return '\ufffd'.repeat(p + 1); - } - if (self.lastNeed > 2 && buf.length > 2) { - if ((buf[2] & 0xC0) !== 0x80) { - self.lastNeed = 2; - return '\ufffd'.repeat(p + 2); - } - } - } -} - -// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. -function utf8FillLast(buf) { - var p = this.lastTotal - this.lastNeed; - var r = utf8CheckExtraBytes(this, buf, p); - if (r !== undefined) return r; - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, p, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, p, 0, buf.length); - this.lastNeed -= buf.length; -} - -// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a -// partial character, the character's bytes are buffered until the required -// number of bytes are available. -function utf8Text(buf, i) { - var total = utf8CheckIncomplete(this, buf, i); - if (!this.lastNeed) return buf.toString('utf8', i); - this.lastTotal = total; - var end = buf.length - (total - this.lastNeed); - buf.copy(this.lastChar, 0, end); - return buf.toString('utf8', i, end); -} - -// For UTF-8, a replacement character for each buffered byte of a (partial) -// character needs to be added to the output. -function utf8End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed); - return r; -} - -// UTF-16LE typically needs two bytes per character, but even if we have an even -// number of bytes available, we need to check if we end on a leading/high -// surrogate. In that case, we need to wait for the next two bytes in order to -// decode the last character properly. -function utf16Text(buf, i) { - if ((buf.length - i) % 2 === 0) { - var r = buf.toString('utf16le', i); - if (r) { - var c = r.charCodeAt(r.length - 1); - if (c >= 0xD800 && c <= 0xDBFF) { - this.lastNeed = 2; - this.lastTotal = 4; - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - return r.slice(0, -1); - } - } - return r; - } - this.lastNeed = 1; - this.lastTotal = 2; - this.lastChar[0] = buf[buf.length - 1]; - return buf.toString('utf16le', i, buf.length - 1); -} - -// For UTF-16LE we do not explicitly append special replacement characters if we -// end on a partial character, we simply let v8 handle that. -function utf16End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) { - var end = this.lastTotal - this.lastNeed; - return r + this.lastChar.toString('utf16le', 0, end); - } - return r; -} - -function base64Text(buf, i) { - var n = (buf.length - i) % 3; - if (n === 0) return buf.toString('base64', i); - this.lastNeed = 3 - n; - this.lastTotal = 3; - if (n === 1) { - this.lastChar[0] = buf[buf.length - 1]; - } else { - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - } - return buf.toString('base64', i, buf.length - n); -} - -function base64End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); - return r; -} - -// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) -function simpleWrite(buf) { - return buf.toString(this.encoding); -} - -function simpleEnd(buf) { - return buf && buf.length ? this.write(buf) : ''; -} - -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a transform stream is a readable/writable stream where you do -// something with the data. Sometimes it's called a "filter", -// but that's not a great name for it, since that implies a thing where -// some bits pass through, and others are simply ignored. (That would -// be a valid example of a transform, of course.) -// -// While the output is causally related to the input, it's not a -// necessarily symmetric or synchronous transformation. For example, -// a zlib stream might take multiple plain-text writes(), and then -// emit a single compressed chunk some time in the future. -// -// Here's how this works: -// -// The Transform stream has all the aspects of the readable and writable -// stream classes. When you write(chunk), that calls _write(chunk,cb) -// internally, and returns false if there's a lot of pending writes -// buffered up. When you call read(), that calls _read(n) until -// there's enough pending readable data buffered up. -// -// In a transform stream, the written data is placed in a buffer. When -// _read(n) is called, it transforms the queued up data, calling the -// buffered _write cb's as it consumes chunks. If consuming a single -// written chunk would result in multiple output chunks, then the first -// outputted bit calls the readcb, and subsequent chunks just go into -// the read buffer, and will cause it to emit 'readable' if necessary. -// -// This way, back-pressure is actually determined by the reading side, -// since _read has to be called to start processing a new chunk. However, -// a pathological inflate type of transform can cause excessive buffering -// here. For example, imagine a stream where every byte of input is -// interpreted as an integer from 0-255, and then results in that many -// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in -// 1kb of data being output. In this case, you could write a very small -// amount of input, and end up with a very large amount of output. In -// such a pathological inflating mechanism, there'd be no way to tell -// the system to stop doing the transform. A single 4MB write could -// cause the system to run out of memory. -// -// However, even in such a pathological case, only a single written chunk -// would be consumed, and then the rest would wait (un-transformed) until -// the results of the previous transformed chunk were consumed. - - - -module.exports = Transform; - -var Duplex = __webpack_require__(5); - -/**/ -var util = __webpack_require__(6); -util.inherits = __webpack_require__(7); -/**/ - -util.inherits(Transform, Duplex); - -function TransformState(stream) { - this.afterTransform = function (er, data) { - return afterTransform(stream, er, data); - }; - - this.needTransform = false; - this.transforming = false; - this.writecb = null; - this.writechunk = null; - this.writeencoding = null; -} - -function afterTransform(stream, er, data) { - var ts = stream._transformState; - ts.transforming = false; - - var cb = ts.writecb; - - if (!cb) { - return stream.emit('error', new Error('write callback called multiple times')); - } - - ts.writechunk = null; - ts.writecb = null; - - if (data !== null && data !== undefined) stream.push(data); - - cb(er); - - var rs = stream._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - stream._read(rs.highWaterMark); - } -} - -function Transform(options) { - if (!(this instanceof Transform)) return new Transform(options); - - Duplex.call(this, options); - - this._transformState = new TransformState(this); - - var stream = this; - - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; - - // we have implemented the _read method, and done the other things - // that Readable wants before the first _read call, so unset the - // sync guard flag. - this._readableState.sync = false; - - if (options) { - if (typeof options.transform === 'function') this._transform = options.transform; - - if (typeof options.flush === 'function') this._flush = options.flush; - } - - // When the writable side finishes, then flush out anything remaining. - this.once('prefinish', function () { - if (typeof this._flush === 'function') this._flush(function (er, data) { - done(stream, er, data); - });else done(stream); - }); -} - -Transform.prototype.push = function (chunk, encoding) { - this._transformState.needTransform = false; - return Duplex.prototype.push.call(this, chunk, encoding); -}; - -// This is the part where you do stuff! -// override this function in implementation classes. -// 'chunk' is an input chunk. -// -// Call `push(newChunk)` to pass along transformed output -// to the readable side. You may call 'push' zero or more times. -// -// Call `cb(err)` when you are done with this chunk. If you pass -// an error, then that'll put the hurt on the whole operation. If you -// never call cb(), then you'll never get another chunk. -Transform.prototype._transform = function (chunk, encoding, cb) { - throw new Error('_transform() is not implemented'); -}; - -Transform.prototype._write = function (chunk, encoding, cb) { - var ts = this._transformState; - ts.writecb = cb; - ts.writechunk = chunk; - ts.writeencoding = encoding; - if (!ts.transforming) { - var rs = this._readableState; - if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); - } -}; - -// Doesn't matter what the args are here. -// _transform does all the work. -// That we got here means that the readable side wants more data. -Transform.prototype._read = function (n) { - var ts = this._transformState; - - if (ts.writechunk !== null && ts.writecb && !ts.transforming) { - ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); - } else { - // mark that we need a transform, so that any data that comes in - // will get processed, now that we've asked for it. - ts.needTransform = true; - } -}; - -Transform.prototype._destroy = function (err, cb) { - var _this = this; - - Duplex.prototype._destroy.call(this, err, function (err2) { - cb(err2); - _this.emit('close'); - }); -}; - -function done(stream, er, data) { - if (er) return stream.emit('error', er); - - if (data !== null && data !== undefined) stream.push(data); - - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - var ws = stream._writableState; - var ts = stream._transformState; - - if (ws.length) throw new Error('Calling transform done when ws.length != 0'); - - if (ts.transforming) throw new Error('Calling transform done when still transforming'); - - return stream.push(null); -} - -/***/ }), -/* 27 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(81); - - -/***/ }), -/* 28 */ -/***/ (function(module, exports, __webpack_require__) { - -var mysql = __webpack_require__(12); -var Connection = __webpack_require__(8); -var EventEmitter = __webpack_require__(4).EventEmitter; -var Util = __webpack_require__(0); -var PoolConnection = __webpack_require__(83); - -module.exports = Pool; - -Util.inherits(Pool, EventEmitter); -function Pool(options) { - EventEmitter.call(this); - this.config = options.config; - this.config.connectionConfig.pool = this; - - this._acquiringConnections = []; - this._allConnections = []; - this._freeConnections = []; - this._connectionQueue = []; - this._closed = false; -} - -Pool.prototype.getConnection = function (cb) { - - if (this._closed) { - var err = new Error('Pool is closed.'); - err.code = 'POOL_CLOSED'; - process.nextTick(function () { - cb(err); - }); - return; - } - - var connection; - var pool = this; - - if (this._freeConnections.length > 0) { - connection = this._freeConnections.shift(); - this.acquireConnection(connection, cb); - return; - } - - if (this.config.connectionLimit === 0 || this._allConnections.length < this.config.connectionLimit) { - connection = new PoolConnection(this, { config: this.config.newConnectionConfig() }); - - this._acquiringConnections.push(connection); - this._allConnections.push(connection); - - connection.connect({timeout: this.config.acquireTimeout}, function onConnect(err) { - spliceConnection(pool._acquiringConnections, connection); - - if (pool._closed) { - err = new Error('Pool is closed.'); - err.code = 'POOL_CLOSED'; - } - - if (err) { - pool._purgeConnection(connection); - cb(err); - return; - } - - pool.emit('connection', connection); - pool.emit('acquire', connection); - cb(null, connection); - }); - return; - } - - if (!this.config.waitForConnections) { - process.nextTick(function(){ - var err = new Error('No connections available.'); - err.code = 'POOL_CONNLIMIT'; - cb(err); - }); - return; - } - - this._enqueueCallback(cb); -}; - -Pool.prototype.acquireConnection = function acquireConnection(connection, cb) { - if (connection._pool !== this) { - throw new Error('Connection acquired from wrong pool.'); - } - - var changeUser = this._needsChangeUser(connection); - var pool = this; - - this._acquiringConnections.push(connection); - - function onOperationComplete(err) { - spliceConnection(pool._acquiringConnections, connection); - - if (pool._closed) { - err = new Error('Pool is closed.'); - err.code = 'POOL_CLOSED'; - } - - if (err) { - pool._connectionQueue.unshift(cb); - pool._purgeConnection(connection); - return; - } - - if (changeUser) { - pool.emit('connection', connection); - } - - pool.emit('acquire', connection); - cb(null, connection); - } - - if (changeUser) { - // restore user back to pool configuration - connection.config = this.config.newConnectionConfig(); - connection.changeUser({timeout: this.config.acquireTimeout}, onOperationComplete); - } else { - // ping connection - connection.ping({timeout: this.config.acquireTimeout}, onOperationComplete); - } -}; - -Pool.prototype.releaseConnection = function releaseConnection(connection) { - - if (this._acquiringConnections.indexOf(connection) !== -1) { - // connection is being acquired - return; - } - - if (connection._pool) { - if (connection._pool !== this) { - throw new Error('Connection released to wrong pool'); - } - - if (this._freeConnections.indexOf(connection) !== -1) { - // connection already in free connection pool - // this won't catch all double-release cases - throw new Error('Connection already released'); - } else { - // add connection to end of free queue - this._freeConnections.push(connection); - this.emit('release', connection); - } - } - - if (this._closed) { - // empty the connection queue - this._connectionQueue.splice(0).forEach(function (cb) { - var err = new Error('Pool is closed.'); - err.code = 'POOL_CLOSED'; - process.nextTick(function () { - cb(err); - }); - }); - } else if (this._connectionQueue.length) { - // get connection with next waiting callback - this.getConnection(this._connectionQueue.shift()); - } -}; - -Pool.prototype.end = function (cb) { - this._closed = true; - - if (typeof cb !== 'function') { - cb = function (err) { - if (err) throw err; - }; - } - - var calledBack = false; - var waitingClose = 0; - - function onEnd(err) { - if (!calledBack && (err || --waitingClose <= 0)) { - calledBack = true; - cb(err); - } - } - - while (this._allConnections.length !== 0) { - waitingClose++; - this._purgeConnection(this._allConnections[0], onEnd); - } - - if (waitingClose === 0) { - process.nextTick(onEnd); - } -}; - -Pool.prototype.query = function (sql, values, cb) { - var query = Connection.createQuery(sql, values, cb); - - if (!(typeof sql === 'object' && 'typeCast' in sql)) { - query.typeCast = this.config.connectionConfig.typeCast; - } - - if (this.config.connectionConfig.trace) { - // Long stack trace support - query._callSite = new Error(); - } - - this.getConnection(function (err, conn) { - if (err) { - query.on('error', function () {}); - query.end(err); - return; - } - - // Release connection based off event - query.once('end', function() { - conn.release(); - }); - - conn.query(query); - }); - - return query; -}; - -Pool.prototype._enqueueCallback = function _enqueueCallback(callback) { - - if (this.config.queueLimit && this._connectionQueue.length >= this.config.queueLimit) { - process.nextTick(function () { - var err = new Error('Queue limit reached.'); - err.code = 'POOL_ENQUEUELIMIT'; - callback(err); - }); - return; - } - - // Bind to domain, as dequeue will likely occur in a different domain - var cb = process.domain - ? process.domain.bind(callback) - : callback; - - this._connectionQueue.push(cb); - this.emit('enqueue'); -}; - -Pool.prototype._needsChangeUser = function _needsChangeUser(connection) { - var connConfig = connection.config; - var poolConfig = this.config.connectionConfig; - - // check if changeUser values are different - return connConfig.user !== poolConfig.user - || connConfig.database !== poolConfig.database - || connConfig.password !== poolConfig.password - || connConfig.charsetNumber !== poolConfig.charsetNumber; -}; - -Pool.prototype._purgeConnection = function _purgeConnection(connection, callback) { - var cb = callback || function () {}; - - if (connection.state === 'disconnected') { - connection.destroy(); - } - - this._removeConnection(connection); - - if (connection.state !== 'disconnected' && !connection._protocol._quitSequence) { - connection._realEnd(cb); - return; - } - - process.nextTick(cb); -}; - -Pool.prototype._removeConnection = function(connection) { - connection._pool = null; - - // Remove connection from all connections - spliceConnection(this._allConnections, connection); - - // Remove connection from free connections - spliceConnection(this._freeConnections, connection); - - this.releaseConnection(connection); -}; - -Pool.prototype.escape = function(value) { - return mysql.escape(value, this.config.connectionConfig.stringifyObjects, this.config.connectionConfig.timezone); -}; - -Pool.prototype.escapeId = function escapeId(value) { - return mysql.escapeId(value, false); -}; - -function spliceConnection(array, connection) { - var index; - if ((index = array.indexOf(connection)) !== -1) { - // Remove connection from all connections - array.splice(index, 1); - } -} - - -/***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { - - -var ConnectionConfig = __webpack_require__(9); - -module.exports = PoolConfig; -function PoolConfig(options) { - if (typeof options === 'string') { - options = ConnectionConfig.parseUrl(options); - } - - this.acquireTimeout = (options.acquireTimeout === undefined) - ? 10 * 1000 - : Number(options.acquireTimeout); - this.connectionConfig = new ConnectionConfig(options); - this.waitForConnections = (options.waitForConnections === undefined) - ? true - : Boolean(options.waitForConnections); - this.connectionLimit = (options.connectionLimit === undefined) - ? 10 - : Number(options.connectionLimit); - this.queueLimit = (options.queueLimit === undefined) - ? 0 - : Number(options.queueLimit); -} - -PoolConfig.prototype.newConnectionConfig = function newConnectionConfig() { - var connectionConfig = new ConnectionConfig(this.connectionConfig); - - connectionConfig.clientFlags = this.connectionConfig.clientFlags; - connectionConfig.maxPacketSize = this.connectionConfig.maxPacketSize; - - return connectionConfig; -}; - - -/***/ }), -/* 30 */ -/***/ (function(module, exports) { - - -/** - * PoolSelector - */ -var PoolSelector = module.exports = {}; - -PoolSelector.RR = function PoolSelectorRoundRobin() { - var index = 0; - - return function(clusterIds) { - if (index >= clusterIds.length) { - index = 0; - } - - var clusterId = clusterIds[index++]; - - return clusterId; - }; -}; - -PoolSelector.RANDOM = function PoolSelectorRandom() { - return function(clusterIds) { - return clusterIds[Math.floor(Math.random() * clusterIds.length)]; - }; -}; - -PoolSelector.ORDER = function PoolSelectorOrder() { - return function(clusterIds) { - return clusterIds[0]; - }; -}; - - -/***/ }), -/* 31 */ -/***/ (function(module, exports, __webpack_require__) { - -const MySQL = __webpack_require__(32); -const Logger = __webpack_require__(86); -const Profiler = __webpack_require__(87); -const parseSettings = __webpack_require__(88); -const { - prepareQuery, typeCast, safeInvoke, sanitizeTransactionInput, -} = __webpack_require__(89); - -let logger = null; -let profiler = null; -let mysql = null; -let config = {}; - -global.exports('mysql_execute', (query, parameters, callback) => { - const invokingResource = global.GetInvokingResource(); - const sql = prepareQuery(query, parameters); - mysql.execute({ sql, typeCast }, invokingResource).then((result) => { - safeInvoke(callback, (result) ? result.affectedRows : 0); - return true; - }).catch(() => false); -}); - -global.exports('mysql_fetch_all', (query, parameters, callback) => { - const invokingResource = global.GetInvokingResource(); - const sql = prepareQuery(query, parameters); - mysql.execute({ sql, typeCast }, invokingResource).then((result) => { - safeInvoke(callback, result); - return true; - }).catch(() => false); -}); - -global.exports('mysql_fetch_scalar', (query, parameters, callback) => { - const invokingResource = global.GetInvokingResource(); - const sql = prepareQuery(query, parameters); - mysql.execute({ sql, typeCast }, invokingResource).then((result) => { - safeInvoke(callback, (result && result[0]) ? Object.values(result[0])[0] : null); - return true; - }).catch(() => false); -}); - -global.exports('mysql_insert', (query, parameters, callback) => { - const invokingResource = global.GetInvokingResource(); - const sql = prepareQuery(query, parameters); - mysql.execute({ sql, typeCast }, invokingResource).then((result) => { - safeInvoke(callback, (result) ? result.insertId : 0); - return true; - }).catch(() => false); -}); - -global.exports('mysql_transaction', (querys, values, callback) => { - const invokingResource = global.GetInvokingResource(); - let sqls = []; - let cb = callback; - [sqls, cb] = sanitizeTransactionInput(querys, values, cb); - mysql.beginTransaction((connection) => { - if (!connection) safeInvoke(cb, false); - const promises = []; - sqls.forEach((sql) => { - promises.push(mysql.execute({ sql }, invokingResource, connection)); - }); - mysql.commitTransaction(promises, connection, (result) => { - safeInvoke(cb, result); - }); - }); -}); - -let isReady = false; -global.exports('is_ready', () => isReady); - -global.on('onServerResourceStart', (resourcename) => { - if (resourcename === 'mysql-async') { - const trace = global.GetConvarInt('mysql_debug', 0); - const slowQueryWarningTime = global.GetConvarInt('mysql_slow_query_warning', 200); - - logger = new Logger(global.GetConvar('mysql_debug_output', 'console')); - profiler = new Profiler(logger, { trace, slowQueryWarningTime }); - - // needs to move to a new file - const connectionString = global.GetConvar('mysql_connection_string', 'Empty'); - if (connectionString === 'Empty') { - logger.error('Empty mysql_connection_string detected.'); - } else { - config = parseSettings(connectionString); - - mysql = new MySQL(config, logger, profiler); - global.emit('onMySQLReady'); // avoid old ESX bugs - isReady = true; - } - } -}); - -global.onNet('mysql-async:request-data', () => { - if (isReady) { - const src = global.source; - global.emitNet('mysql-async:update-resource-data', src, profiler.profiles.resources); - global.emitNet('mysql-async:update-time-data', src, profiler.profiles.executionTimes); - global.emitNet('mysql-async:update-slow-queries', src, profiler.profiles.slowQueries); - } -}); - - -/***/ }), -/* 32 */ -/***/ (function(module, exports, __webpack_require__) { - -const mysql = __webpack_require__(12); - -function formatVersion(versionString) { - let versionPrefix = 'MariaDB'; - const version = versionString; - if (version[0] === '5' || version[0] === '8') { - versionPrefix = 'MySQL'; - } - return { versionPrefix, version }; -} - -class MySQL { - constructor(mysqlConfig, logger, profiler) { - this.pool = null; - this.profiler = profiler; - this.logger = logger; - if (typeof mysqlConfig === 'object') { - this.pool = mysql.createPool(mysqlConfig); - } else { - this.logger.error(`[ERROR] [MySQL] Unexpected configuration of type ${typeof mysqlconfig} received.`); - } - - this.pool.query('SELECT VERSION()', (error, result) => { - if (!error) { - const { versionPrefix, version } = formatVersion(result[0]['VERSION()']); - profiler.setVersion(`${versionPrefix}:${version}`); - logger.log('\x1b[32m[mysql-async]\x1b[0m Database server connection established.'); - } else { - logger.error(`[ERROR] ${error.message}`); - } - }); - - // for people with faulty network configurations, to keep the handle for timing out - // might be some tcp / udp issue - if (mysqlConfig.keepAlive) { - this.ping(Number(mysqlConfig.keepAlive)); - } - } - - // for people with faulty network configurations, to keep the handle for timing out - // might be some tcp / udp issue - // actual function that keeps the connection alive - ping(keepAliveTimeout) { - if (keepAliveTimeout && keepAliveTimeout > 0) { - this.execute({ sql: 'SELECT 1' }, 'mysql-async:keepAlive').then(() => { - setTimeout(() => this.ping(keepAliveTimeout), keepAliveTimeout * 1000); - }); - } - } - - execute(sql, invokingResource, connection) { - const queryPromise = new Promise((resolve, reject) => { - const start = process.hrtime(); - const db = connection || this.pool; - - db.query(sql, (error, result) => { - this.profiler.profile(process.hrtime(start), sql.sql, invokingResource); - if (error) reject(error); - resolve(result); - }); - }).catch((error) => { - this.logger.error(`[ERROR] [MySQL] [${invokingResource}] An error happens on MySQL for query "${sql.sql}": ${error.message}`); - }); - - return queryPromise; - } - - onTransactionError(error, connection, callback) { - connection.rollback(() => { - this.logger.error(error.message); - callback(false); - }); - } - - beginTransaction(callback) { - this.pool.getConnection((connectionError, connection) => { - if (connectionError) { - this.logger.error(connectionError.message); - callback(false); - return; - } - connection.beginTransaction((transactionError) => { - if (transactionError) this.onTransactionError(transactionError, connection, callback); - else callback(connection); - }); - }); - } - - commitTransaction(promises, connection, callback) { - Promise.all(promises).then(() => { - connection.commit((commitError) => { - if (commitError) this.onTransactionError(commitError, connection, callback); - else callback(true); - }); - // Otherwise catch the error from the execution - }).catch((executeError) => { - this.onTransactionError(executeError, connection, callback); - }); - } -} - -module.exports = MySQL; - - -/***/ }), -/* 33 */ -/***/ (function(module, exports) { - -module.exports = require("net"); - -/***/ }), -/* 34 */ -/***/ (function(module, exports) { - -module.exports = require("tls"); - -/***/ }), -/* 35 */ -/***/ (function(module, exports) { - -module.exports = require("url"); - -/***/ }), -/* 36 */ -/***/ (function(module, exports) { - -// Certificates for Amazon RDS -exports['Amazon RDS'] = { - ca: [ - /** - * Amazon RDS global certificate 2010 to 2015 - * - * CN = aws.amazon.com/rds/ - * OU = RDS - * O = Amazon.com - * L = Seattle - * ST = Washington - * C = US - * P = 2010-04-05T22:44:31Z/2015-04-04T22:41:31Z - * F = 7F:09:8D:A5:7D:BB:A6:EF:7C:70:D8:CA:4E:49:11:55:7E:89:A7:D3 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIIDQzCCAqygAwIBAgIJAOd1tlfiGoEoMA0GCSqGSIb3DQEBBQUAMHUxCzAJBgNV\n' - + 'BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdTZWF0dGxlMRMw\n' - + 'EQYDVQQKEwpBbWF6b24uY29tMQwwCgYDVQQLEwNSRFMxHDAaBgNVBAMTE2F3cy5h\n' - + 'bWF6b24uY29tL3Jkcy8wHhcNMTAwNDA1MjI0NDMxWhcNMTUwNDA0MjI0NDMxWjB1\n' - + 'MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHU2Vh\n' - + 'dHRsZTETMBEGA1UEChMKQW1hem9uLmNvbTEMMAoGA1UECxMDUkRTMRwwGgYDVQQD\n' - + 'ExNhd3MuYW1hem9uLmNvbS9yZHMvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n' - + 'gQDKhXGU7tizxUR5WaFoMTFcxNxa05PEjZaIOEN5ctkWrqYSRov0/nOMoZjqk8bC\n' - + 'med9vPFoQGD0OTakPs0jVe3wwmR735hyVwmKIPPsGlaBYj1O6llIpZeQVyupNx56\n' - + 'UzqtiLaDzh1KcmfqP3qP2dInzBfJQKjiRudo1FWnpPt33QIDAQABo4HaMIHXMB0G\n' - + 'A1UdDgQWBBT/H3x+cqSkR/ePSIinPtc4yWKe3DCBpwYDVR0jBIGfMIGcgBT/H3x+\n' - + 'cqSkR/ePSIinPtc4yWKe3KF5pHcwdTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh\n' - + 'c2hpbmd0b24xEDAOBgNVBAcTB1NlYXR0bGUxEzARBgNVBAoTCkFtYXpvbi5jb20x\n' - + 'DDAKBgNVBAsTA1JEUzEcMBoGA1UEAxMTYXdzLmFtYXpvbi5jb20vcmRzL4IJAOd1\n' - + 'tlfiGoEoMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAvguZy/BDT66x\n' - + 'GfgnJlyQwnFSeVLQm9u/FIvz4huGjbq9dqnD6h/Gm56QPFdyMEyDiZWaqY6V08lY\n' - + 'LTBNb4kcIc9/6pc0/ojKciP5QJRm6OiZ4vgG05nF4fYjhU7WClUx7cxq1fKjNc2J\n' - + 'UCmmYqgiVkAGWRETVo+byOSDZ4swb10=\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS global root CA 2015 to 2020 - * - * CN = Amazon RDS Root CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2015-02-05T09:11:31Z/2020-03-05T09:11:31Z - * F = E8:11:88:56:E7:A7:CE:3E:5E:DC:9A:31:25:1B:93:AC:DC:43:CE:B0 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID9DCCAtygAwIBAgIBQjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUwOTExMzFaFw0y\n' - + 'MDAzMDUwOTExMzFaMIGKMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEbMBkGA1UEAwwSQW1hem9uIFJE\n' - + 'UyBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuD8nrZ8V\n' - + 'u+VA8yVlUipCZIKPTDcOILYpUe8Tct0YeQQr0uyl018StdBsa3CjBgvwpDRq1HgF\n' - + 'Ji2N3+39+shCNspQeE6aYU+BHXhKhIIStt3r7gl/4NqYiDDMWKHxHq0nsGDFfArf\n' - + 'AOcjZdJagOMqb3fF46flc8k2E7THTm9Sz4L7RY1WdABMuurpICLFE3oHcGdapOb9\n' - + 'T53pQR+xpHW9atkcf3pf7gbO0rlKVSIoUenBlZipUlp1VZl/OD/E+TtRhDDNdI2J\n' - + 'P/DSMM3aEsq6ZQkfbz/Ilml+Lx3tJYXUDmp+ZjzMPLk/+3beT8EhrwtcG3VPpvwp\n' - + 'BIOqsqVVTvw/CwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\n' - + 'AwEB/zAdBgNVHQ4EFgQUTgLurD72FchM7Sz1BcGPnIQISYMwHwYDVR0jBBgwFoAU\n' - + 'TgLurD72FchM7Sz1BcGPnIQISYMwDQYJKoZIhvcNAQEFBQADggEBAHZcgIio8pAm\n' - + 'MjHD5cl6wKjXxScXKtXygWH2BoDMYBJF9yfyKO2jEFxYKbHePpnXB1R04zJSWAw5\n' - + '2EUuDI1pSBh9BA82/5PkuNlNeSTB3dXDD2PEPdzVWbSKvUB8ZdooV+2vngL0Zm4r\n' - + '47QPyd18yPHrRIbtBtHR/6CwKevLZ394zgExqhnekYKIqqEX41xsUV0Gm6x4vpjf\n' - + '2u6O/+YE2U+qyyxHE5Wd5oqde0oo9UUpFETJPVb6Q2cEeQib8PBAyi0i6KnF+kIV\n' - + 'A9dY7IHSubtCK/i8wxMVqfd5GtbA8mmpeJFwnDvm9rBEsHybl08qlax9syEwsUYr\n' - + '/40NawZfTUU=\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS ap-northeast-1 certificate CA 2015 to 2020 - * - * CN = Amazon RDS ap-northeast-1 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2015-02-05T22:03:06Z/2020-03-05T22:03:06Z - * F = 4B:2D:8A:E0:C1:A3:A9:AF:A7:BB:65:0C:5A:16:8A:39:3C:03:F2:C5 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIIEATCCAumgAwIBAgIBRDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMDZaFw0y\n' - + 'MDAzMDUyMjAzMDZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' - + 'UyBhcC1ub3J0aGVhc3QtMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' - + 'ggEBAMmM2B4PfTXCZjbZMWiDPyxvk/eeNwIRJAhfzesiGUiLozX6CRy3rwC1ZOPV\n' - + 'AcQf0LB+O8wY88C/cV+d4Q2nBDmnk+Vx7o2MyMh343r5rR3Na+4izd89tkQVt0WW\n' - + 'vO21KRH5i8EuBjinboOwAwu6IJ+HyiQiM0VjgjrmEr/YzFPL8MgHD/YUHehqjACn\n' - + 'C0+B7/gu7W4qJzBL2DOf7ub2qszGtwPE+qQzkCRDwE1A4AJmVE++/FLH2Zx78Egg\n' - + 'fV1sUxPtYgjGH76VyyO6GNKM6rAUMD/q5mnPASQVIXgKbupr618bnH+SWHFjBqZq\n' - + 'HvDGPMtiiWII41EmGUypyt5AbysCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' - + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFIiKM0Q6n1K4EmLxs3ZXxINbwEwR\n' - + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' - + 'A4IBAQBezGbE9Rw/k2e25iGjj5n8r+M3dlye8ORfCE/dijHtxqAKasXHgKX8I9Tw\n' - + 'JkBiGWiuzqn7gO5MJ0nMMro1+gq29qjZnYX1pDHPgsRjUX8R+juRhgJ3JSHijRbf\n' - + '4qNJrnwga7pj94MhcLq9u0f6dxH6dXbyMv21T4TZMTmcFduf1KgaiVx1PEyJjC6r\n' - + 'M+Ru+A0eM+jJ7uCjUoZKcpX8xkj4nmSnz9NMPog3wdOSB9cAW7XIc5mHa656wr7I\n' - + 'WJxVcYNHTXIjCcng2zMKd1aCcl2KSFfy56sRfT7J5Wp69QSr+jq8KM55gw8uqAwi\n' - + 'VPrXn2899T1rcTtFYFP16WXjGuc0\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS ap-northeast-2 certificate CA 2015 to 2020 - * - * CN = Amazon RDS ap-northeast-2 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2015-11-06T00:05:46Z/2020-03-05T00:05:46Z - * F = 77:D9:33:4E:CE:56:FC:42:7B:29:57:8D:67:59:ED:29:4E:18:CB:6B - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIIEATCCAumgAwIBAgIBTDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTExMDYwMDA1NDZaFw0y\n' - + 'MDAzMDUwMDA1NDZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' - + 'UyBhcC1ub3J0aGVhc3QtMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' - + 'ggEBAKSwd+RVUzTRH0FgnbwoTK8TMm/zMT4+2BvALpAUe6YXbkisg2goycWuuWLg\n' - + 'jOpFBB3GtyvXZnkqi7MkDWUmj1a2kf8l2oLyoaZ+Hm9x/sV+IJzOqPvj1XVUGjP6\n' - + 'yYYnPJmUYqvZeI7fEkIGdFkP2m4/sgsSGsFvpD9FK1bL1Kx2UDpYX0kHTtr18Zm/\n' - + '1oN6irqWALSmXMDydb8hE0FB2A1VFyeKE6PnoDj/Y5cPHwPPdEi6/3gkDkSaOG30\n' - + 'rWeQfL3pOcKqzbHaWTxMphd0DSL/quZ64Nr+Ly65Q5PRcTrtr55ekOUziuqXwk+o\n' - + '9QpACMwcJ7ROqOznZTqTzSFVXFECAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' - + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFM6Nox/QWbhzWVvzoJ/y0kGpNPK+\n' - + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' - + 'A4IBAQCTkWBqNvyRf3Y/W21DwFx3oT/AIWrHt0BdGZO34tavummXemTH9LZ/mqv9\n' - + 'aljt6ZuDtf5DEQjdsAwXMsyo03ffnP7doWm8iaF1+Mui77ot0TmTsP/deyGwukvJ\n' - + 'tkxX8bZjDh+EaNauWKr+CYnniNxCQLfFtXYJsfOdVBzK3xNL+Z3ucOQRhr2helWc\n' - + 'CDQgwfhP1+3pRVKqHvWCPC4R3fT7RZHuRmZ38kndv476GxRntejh+ePffif78bFI\n' - + '3rIZCPBGobrrUMycafSbyXteoGca/kA+/IqrAPlk0pWQ4aEL0yTWN2h2dnjoD7oX\n' - + 'byIuL/g9AGRh97+ssn7D6bDRPTbW\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS ap-southeast-1 certificate CA 2015 to 2020 - * - * CN = Amazon RDS ap-southeast-1 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2015-02-05T22:03:19Z/2020-03-05T22:03:19Z - * F = 0E:EC:5D:BD:F9:80:EE:A9:A0:8D:81:AC:37:D9:8D:34:1C:CD:27:D1 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIIEATCCAumgAwIBAgIBRTANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMTlaFw0y\n' - + 'MDAzMDUyMjAzMTlaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' - + 'UyBhcC1zb3V0aGVhc3QtMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' - + 'ggEBANaXElmSEYt/UtxHFsARFhSUahTf1KNJzR0Dmay6hqOXQuRVbKRwPd19u5vx\n' - + 'DdF1sLT7D69IK3VDnUiQScaCv2Dpu9foZt+rLx+cpx1qiQd1UHrvqq8xPzQOqCdC\n' - + 'RFStq6yVYZ69yfpfoI67AjclMOjl2Vph3ftVnqP0IgVKZdzeC7fd+umGgR9xY0Qr\n' - + 'Ubhd/lWdsbNvzK3f1TPWcfIKQnpvSt85PIEDJir6/nuJUKMtmJRwTymJf0i+JZ4x\n' - + '7dJa341p2kHKcHMgOPW7nJQklGBA70ytjUV6/qebS3yIugr/28mwReflg3TJzVDl\n' - + 'EOvi6pqbqNbkMuEwGDCmEQIVqgkCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' - + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAu93/4k5xbWOsgdCdn+/KdiRuit\n' - + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' - + 'A4IBAQBlcjSyscpPjf5+MgzMuAsCxByqUt+WFspwcMCpwdaBeHOPSQrXNqX2Sk6P\n' - + 'kth6oCivA64trWo8tFMvPYlUA1FYVD5WpN0kCK+P5pD4KHlaDsXhuhClJzp/OP8t\n' - + 'pOyUr5109RHLxqoKB5J5m1XA7rgcFjnMxwBSWFe3/4uMk/+4T53YfCVXuc6QV3i7\n' - + 'I/2LAJwFf//pTtt6fZenYfCsahnr2nvrNRNyAxcfvGZ/4Opn/mJtR6R/AjvQZHiR\n' - + 'bkRNKF2GW0ueK5W4FkZVZVhhX9xh1Aj2Ollb+lbOqADaVj+AT3PoJPZ3MPQHKCXm\n' - + 'xwG0LOLlRr/TfD6li1AfOVTAJXv9\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS ap-southeast-2 certificate CA 2015 to 2020 - * - * CN = Amazon RDS ap-southeast-2 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2015-02-05T22:03:24Z/2020-03-05T22:03:24Z - * F = 20:D9:A8:82:23:AB:B9:E5:C5:24:10:D3:4D:0F:3D:B1:31:DF:E5:14 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIIEATCCAumgAwIBAgIBRjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMjRaFw0y\n' - + 'MDAzMDUyMjAzMjRaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' - + 'UyBhcC1zb3V0aGVhc3QtMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' - + 'ggEBAJqBAJutz69hFOh3BtLHZTbwE8eejGGKayn9hu98YMDPzWzGXWCmW+ZYWELA\n' - + 'cY3cNWNF8K4FqKXFr2ssorBYim1UtYFX8yhydT2hMD5zgQ2sCGUpuidijuPA6zaq\n' - + 'Z3tdhVR94f0q8mpwpv2zqR9PcqaGDx2VR1x773FupRPRo7mEW1vC3IptHCQlP/zE\n' - + '7jQiLl28bDIH2567xg7e7E9WnZToRnhlYdTaDaJsHTzi5mwILi4cihSok7Shv/ME\n' - + 'hnukvxeSPUpaVtFaBhfBqq055ePq9I+Ns4KGreTKMhU0O9fkkaBaBmPaFgmeX/XO\n' - + 'n2AX7gMouo3mtv34iDTZ0h6YCGkCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' - + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFIlQnY0KHYWn1jYumSdJYfwj/Nfw\n' - + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' - + 'A4IBAQA0wVU6/l41cTzHc4azc4CDYY2Wd90DFWiH9C/mw0SgToYfCJ/5Cfi0NT/Y\n' - + 'PRnk3GchychCJgoPA/k9d0//IhYEAIiIDjyFVgjbTkKV3sh4RbdldKVOUB9kumz/\n' - + 'ZpShplsGt3z4QQiVnKfrAgqxWDjR0I0pQKkxXa6Sjkicos9LQxVtJ0XA4ieG1E7z\n' - + 'zJr+6t80wmzxvkInSaWP3xNJK9azVRTrgQZQlvkbpDbExl4mNTG66VD3bAp6t3Wa\n' - + 'B49//uDdfZmPkqqbX+hsxp160OH0rxJppwO3Bh869PkDnaPEd/Pxw7PawC+li0gi\n' - + 'NRV8iCEx85aFxcyOhqn0WZOasxee\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS eu-central-1 certificate CA 2015 to 2020 - * - * CN = Amazon RDS eu-central-1 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2015-02-05T22:03:31Z/2020-03-05T22:03:31Z - * F = 94:B4:DF:B9:6D:7E:F7:C3:B7:BF:51:E9:A6:B7:44:A0:D0:82:11:84 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID/zCCAuegAwIBAgIBRzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMzFaFw0y\n' - + 'MDAzMDUyMjAzMzFaMIGSMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEjMCEGA1UEAwwaQW1hem9uIFJE\n' - + 'UyBldS1jZW50cmFsLTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\n' - + 'AQDFtP2dhSLuaPOI4ZrrPWsK4OY9ocQBp3yApH1KJYmI9wpQKZG/KCH2E6Oo7JAw\n' - + 'QORU519r033T+FO2Z7pFPlmz1yrxGXyHpJs8ySx3Yo5S8ncDCdZJCLmtPiq/hahg\n' - + '5/0ffexMFUCQaYicFZsrJ/cStdxUV+tSw2JQLD7UxS9J97LQWUPyyG+ZrjYVTVq+\n' - + 'zudnFmNSe4QoecXMhAFTGJFQXxP7nhSL9Ao5FGgdXy7/JWeWdQIAj8ku6cBDKPa6\n' - + 'Y6kP+ak+In+Lye8z9qsCD/afUozfWjPR2aA4JoIZVF8dNRShIMo8l0XfgfM2q0+n\n' - + 'ApZWZ+BjhIO5XuoUgHS3D2YFAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNV\n' - + 'HRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBRm4GsWIA/M6q+tK8WGHWDGh2gcyTAf\n' - + 'BgNVHSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOC\n' - + 'AQEAHpMmeVQNqcxgfQdbDIi5UIy+E7zZykmtAygN1XQrvga9nXTis4kOTN6g5/+g\n' - + 'HCx7jIXeNJzAbvg8XFqBN84Quqgpl/tQkbpco9Jh1HDs558D5NnZQxNqH5qXQ3Mm\n' - + 'uPgCw0pYcPOa7bhs07i+MdVwPBsX27CFDtsgAIru8HvKxY1oTZrWnyIRo93tt/pk\n' - + 'WuItVMVHjaQZVfTCow0aDUbte6Vlw82KjUFq+n2NMSCJDiDKsDDHT6BJc4AJHIq3\n' - + '/4Z52MSC9KMr0yAaaoWfW/yMEj9LliQauAgwVjArF4q78rxpfKTG9Rfd8U1BZANP\n' - + '7FrFMN0ThjfA1IvmOYcgskY5bQ==\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS eu-west-1 certificate CA 2015 to 2020 - * - * CN = Amazon RDS eu-west-1 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2015-02-05T22:03:35Z/2020-03-05T22:03:35Z - * F = 1A:95:F0:43:82:D2:5D:A6:AD:F5:13:27:0B:40:8A:72:D9:92:F3:E0 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID/DCCAuSgAwIBAgIBSDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMzVaFw0y\n' - + 'MDAzMDUyMjAzMzVaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' - + 'UyBldS13ZXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx\n' - + 'PdbqQ0HKRj79Pmocxvjc+P6i4Ux24kgFIl+ckiir1vzkmesc3a58gjrMlCksEObt\n' - + 'Yihs5IhzEq1ePT0gbfS9GYFp34Uj/MtPwlrfCBWG4d2TcrsKRHr1/EXUYhWqmdrb\n' - + 'RhX8XqoRhVkbF/auzFSBhTzcGGvZpQ2KIaxRcQfcXlMVhj/pxxAjh8U4F350Fb0h\n' - + 'nX1jw4/KvEreBL0Xb2lnlGTkwVxaKGSgXEnOgIyOFdOQc61vdome0+eeZsP4jqeR\n' - + 'TGYJA9izJsRbe2YJxHuazD+548hsPlM3vFzKKEVURCha466rAaYAHy3rKur3HYQx\n' - + 'Yt+SoKcEz9PXuSGj96ejAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' - + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBTebg//h2oeXbZjQ4uuoiuLYzuiPDAfBgNV\n' - + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' - + 'TikPaGeZasTPw+4RBemlsyPAjtFFQLo7ddaFdORLgdEysVf8aBqndvbA6MT/v4lj\n' - + 'GtEtUdF59ZcbWOrVm+fBZ2h/jYJ59dYF/xzb09nyRbdMSzB9+mkSsnOMqluq5y8o\n' - + 'DY/PfP2vGhEg/2ZncRC7nlQU1Dm8F4lFWEiQ2fi7O1cW852Vmbq61RIfcYsH/9Ma\n' - + 'kpgk10VZ75b8m3UhmpZ/2uRY+JEHImH5WpcTJ7wNiPNJsciZMznGtrgOnPzYco8L\n' - + 'cDleOASIZifNMQi9PKOJKvi0ITz0B/imr8KBsW0YjZVJ54HMa7W1lwugSM7aMAs+\n' - + 'E3Sd5lS+SHwWaOCHwhOEVA==\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS sa-east-1 certificate CA 2015 to 2020 - * - * CN = Amazon RDS sa-east-1 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2015-02-05T22:03:40Z/2020-03-05T22:03:40Z - * F = 32:10:3D:FA:6D:42:F5:35:98:40:15:F4:4C:74:74:27:CB:CE:D4:B5 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID/DCCAuSgAwIBAgIBSTANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNDBaFw0y\n' - + 'MDAzMDUyMjAzNDBaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' - + 'UyBzYS1lYXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCU\n' - + 'X4OBnQ5xA6TLJAiFEI6l7bUWjoVJBa/VbMdCCSs2i2dOKmqUaXu2ix2zcPILj3lZ\n' - + 'GMk3d/2zvTK/cKhcFrewHUBamTeVHdEmynhMQamqNmkM4ptYzFcvEUw1TGxHT4pV\n' - + 'Q6gSN7+/AJewQvyHexHo8D0+LDN0/Wa9mRm4ixCYH2CyYYJNKaZt9+EZfNu+PPS4\n' - + '8iB0TWH0DgQkbWMBfCRgolLLitAZklZ4dvdlEBS7evN1/7ttBxUK6SvkeeSx3zBl\n' - + 'ww3BlXqc3bvTQL0A+RRysaVyFbvtp9domFaDKZCpMmDFAN/ntx215xmQdrSt+K3F\n' - + 'cXdGQYHx5q410CAclGnbAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' - + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBT6iVWnm/uakS+tEX2mzIfw+8JL0zAfBgNV\n' - + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' - + 'FmDD+QuDklXn2EgShwQxV13+txPRuVdOSrutHhoCgMwFWCMtPPtBAKs6KPY7Guvw\n' - + 'DpJoZSehDiOfsgMirjOWjvfkeWSNvKfjWTVneX7pZD9W5WPnsDBvTbCGezm+v87z\n' - + 'b+ZM2ZMo98m/wkMcIEAgdSKilR2fuw8rLkAjhYFfs0A7tDgZ9noKwgHvoE4dsrI0\n' - + 'KZYco6DlP/brASfHTPa2puBLN9McK3v+h0JaSqqm5Ro2Bh56tZkQh8AWy/miuDuK\n' - + '3+hNEVdxosxlkM1TPa1DGj0EzzK0yoeerXuH2HX7LlCrrxf6/wdKnjR12PMrLQ4A\n' - + 'pCqkcWw894z6bV9MAvKe6A==\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS us-east-1 certificate CA 2015 to 2020 - * - * CN = Amazon RDS us-east-1 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2015-02-05T21:54:04Z/2020-03-05T21:54:04Z - * F = 34:47:8A:90:8A:83:AE:45:DC:B6:16:76:D2:35:EC:E9:75:C6:2C:63 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID/DCCAuSgAwIBAgIBQzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMTU0MDRaFw0y\n' - + 'MDAzMDUyMTU0MDRaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' - + 'UyB1cy1lYXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDI\n' - + 'UIuwh8NusKHk1SqPXcP7OqxY3S/M2ZyQWD3w7Bfihpyyy/fc1w0/suIpX3kbMhAV\n' - + '2ESwged2/2zSx4pVnjp/493r4luhSqQYzru78TuPt9bhJIJ51WXunZW2SWkisSaf\n' - + 'USYUzVN9ezR/bjXTumSUQaLIouJt3OHLX49s+3NAbUyOI8EdvgBQWD68H1epsC0n\n' - + 'CI5s+pIktyOZ59c4DCDLQcXErQ+tNbDC++oct1ANd/q8p9URonYwGCGOBy7sbCYq\n' - + '9eVHh1Iy2M+SNXddVOGw5EuruvHoCIQyOz5Lz4zSuZA9dRbrfztNOpezCNYu6NKM\n' - + 'n+hzcvdiyxv77uNm8EaxAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' - + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBQSQG3TmMe6Sa3KufaPBa72v4QFDzAfBgNV\n' - + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' - + 'L/mOZfB3187xTmjOHMqN2G2oSKHBKiQLM9uv8+97qT+XR+TVsBT6b3yoPpMAGhHA\n' - + 'Pc7nxAF5gPpuzatx0OTLPcmYucFmfqT/1qA5WlgCnMNtczyNMH97lKFTNV7Njtek\n' - + 'jWEzAEQSyEWrkNpNlC4j6kMYyPzVXQeXUeZTgJ9FNnVZqmvfjip2N22tawMjrCn5\n' - + '7KN/zN65EwY2oO9XsaTwwWmBu3NrDdMbzJnbxoWcFWj4RBwanR1XjQOVNhDwmCOl\n' - + '/1Et13b8CPyj69PC8BOVU6cfTSx8WUVy0qvYOKHNY9Bqa5BDnIL3IVmUkeTlM1mt\n' - + 'enRpyBj+Bk9rh/ICdiRKmA==\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS us-west-1 certificate CA 2015 to 2020 - * - * CN = Amazon RDS us-west-1 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2015-02-05T22:03:45Z/2020-03-05T22:03:45Z - * F = EF:94:2F:E3:58:0E:09:D6:79:C2:16:97:91:FB:37:EA:D7:70:A8:4B - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID/DCCAuSgAwIBAgIBSjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNDVaFw0y\n' - + 'MDAzMDUyMjAzNDVaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' - + 'UyB1cy13ZXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDE\n' - + 'Dhw+uw/ycaiIhhyu2pXFRimq0DlB8cNtIe8hdqndH8TV/TFrljNgR8QdzOgZtZ9C\n' - + 'zzQ2GRpInN/qJF6slEd6wO+6TaDBQkPY+07TXNt52POFUhdVkhJXHpE2BS7Xn6J7\n' - + '7RFAOeG1IZmc2DDt+sR1BgXzUqHslQGfFYNS0/MBO4P+ya6W7IhruB1qfa4HiYQS\n' - + 'dbe4MvGWnv0UzwAqdR7OF8+8/5c58YXZIXCO9riYF2ql6KNSL5cyDPcYK5VK0+Q9\n' - + 'VI6vuJHSMYcF7wLePw8jtBktqAFE/wbdZiIHhZvNyiNWPPNTGUmQbaJ+TzQEHDs5\n' - + '8en+/W7JKnPyBOkxxENbAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' - + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBS0nw/tFR9bCjgqWTPJkyy4oOD8bzAfBgNV\n' - + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' - + 'CXGAY3feAak6lHdqj6+YWjy6yyUnLK37bRxZDsyDVXrPRQaXRzPTzx79jvDwEb/H\n' - + 'Q/bdQ7zQRWqJcbivQlwhuPJ4kWPUZgSt3JUUuqkMsDzsvj/bwIjlrEFDOdHGh0mi\n' - + 'eVIngFEjUXjMh+5aHPEF9BlQnB8LfVtKj18e15UDTXFa+xJPFxUR7wDzCfo4WI1m\n' - + 'sUMG4q1FkGAZgsoyFPZfF8IVvgCuGdR8z30VWKklFxttlK0eGLlPAyIO0CQxPQlo\n' - + 'saNJrHf4tLOgZIWk+LpDhNd9Et5EzvJ3aURUsKY4pISPPF5WdvM9OE59bERwUErd\n' - + 'nuOuQWQeeadMceZnauRzJQ==\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS us-west-2 certificate CA 2015 to 2020 - * - * CN = Amazon RDS us-west-2 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2015-02-05T22:03:50Z/2020-03-05T22:03:50Z - * F = 94:2C:A8:B0:23:48:17:F0:CD:2F:19:7F:C1:E0:21:7C:65:79:13:3A - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID/DCCAuSgAwIBAgIBSzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNTBaFw0y\n' - + 'MDAzMDUyMjAzNTBaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' - + 'UyB1cy13ZXN0LTIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDM\n' - + 'H58SR48U6jyERC1vYTnub34smf5EQVXyzaTmspWGWGzT31NLNZGSDFaa7yef9kdO\n' - + 'mzJsgebR5tXq6LdwlIoWkKYQ7ycUaadtVKVYdI40QcI3cHn0qLFlg2iBXmWp/B+i\n' - + 'Z34VuVlCh31Uj5WmhaBoz8t/GRqh1V/aCsf3Wc6jCezH3QfuCjBpzxdOOHN6Ie2v\n' - + 'xX09O5qmZTvMoRBAvPkxdaPg/Mi7fxueWTbEVk78kuFbF1jHYw8U1BLILIAhcqlq\n' - + 'x4u8nl73t3O3l/soNUcIwUDK0/S+Kfqhwn9yQyPlhb4Wy3pfnZLJdkyHldktnQav\n' - + '9TB9u7KH5Lk0aAYslMLxAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' - + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBT8roM4lRnlFHWMPWRz0zkwFZog1jAfBgNV\n' - + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' - + 'JwrxwgwmPtcdaU7O7WDdYa4hprpOMamI49NDzmE0s10oGrqmLwZygcWU0jT+fJ+Y\n' - + 'pJe1w0CVfKaeLYNsOBVW3X4ZPmffYfWBheZiaiEflq/P6t7/Eg81gaKYnZ/x1Dfa\n' - + 'sUYkzPvCkXe9wEz5zdUTOCptDt89rBR9CstL9vE7WYUgiVVmBJffWbHQLtfjv6OF\n' - + 'NMb0QME981kGRzc2WhgP71YS2hHd1kXtsoYP1yTu4vThSKsoN4bkiHsaC1cRkLoy\n' - + '0fFA4wpB3WloMEvCDaUvvH1LZlBXTNlwi9KtcwD4tDxkkBt4tQczKLGpQ/nF/W9n\n' - + '8YDWk3IIc1sd0bkZqoau2Q==\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS ap-south-1 certificate CA 2016 to 2020 - * - * CN = Amazon RDS ap-south-1 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2016-05-03T21:29:22Z/2020-03-05T21:29:22Z - * F = F3:A3:C2:52:D9:82:20:AC:8C:62:31:2A:8C:AD:5D:7B:1C:31:F1:DD - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID/TCCAuWgAwIBAgIBTTANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjA1MDMyMTI5MjJaFw0y\n' - + 'MDAzMDUyMTI5MjJaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEhMB8GA1UEAwwYQW1hem9uIFJE\n' - + 'UyBhcC1zb3V0aC0xIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n' - + '06eWGLE0TeqL9kyWOLkS8q0fXO97z+xyBV3DKSB2lg2GkgBz3B98MkmkeB0SZy3G\n' - + 'Ce4uCpCPbFKiFEdiUclOlhZsrBuCeaimxLM3Ig2wuenElO/7TqgaYHYUbT3d+VQW\n' - + 'GUbLn5GRZJZe1OAClYdOWm7A1CKpuo+cVV1vxbY2nGUQSJPpVn2sT9gnwvjdE60U\n' - + 'JGYU/RLCTm8zmZBvlWaNIeKDnreIc4rKn6gUnJ2cQn1ryCVleEeyc3xjYDSrjgdn\n' - + 'FLYGcp9mphqVT0byeQMOk0c7RHpxrCSA0V5V6/CreFV2LteK50qcDQzDSM18vWP/\n' - + 'p09FoN8O7QrtOeZJzH/lmwIDAQABo2YwZDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0T\n' - + 'AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU2i83QHuEl/d0keXF+69HNJph7cMwHwYD\n' - + 'VR0jBBgwFoAUTgLurD72FchM7Sz1BcGPnIQISYMwDQYJKoZIhvcNAQELBQADggEB\n' - + 'ACqnH2VjApoDqoSQOky52QBwsGaj+xWYHW5Gm7EvCqvQuhWMkeBuD6YJmMvNyA9G\n' - + 'I2lh6/o+sUk/RIsbYbxPRdhNPTOgDR9zsNRw6qxaHztq/CEC+mxDCLa3O1hHBaDV\n' - + 'BmB3nCZb93BvO0EQSEk7aytKq/f+sjyxqOcs385gintdHGU9uM7gTZHnU9vByJsm\n' - + '/TL07Miq67X0NlhIoo3jAk+xHaeKJdxdKATQp0448P5cY20q4b8aMk1twcNaMvCP\n' - + 'dG4M5doaoUA8OQ/0ukLLae/LBxLeTw04q1/a2SyFaVUX2Twbb1S3xVWwLA8vsyGr\n' - + 'igXx7B5GgP+IHb6DTjPJAi0=\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS ca-central-1 certificate CA 2016 to 2020 - * - * CN = Amazon RDS ca-central-1 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2016-09-15T00:10:11Z/2020-03-05T00:10:11Z - * F = D7:E0:16:AB:8A:0B:63:9F:67:1F:16:87:42:F4:0A:EE:73:A6:FC:04 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID/zCCAuegAwIBAgIBTzANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjA5MTUwMDEwMTFaFw0y\n' - + 'MDAzMDUwMDEwMTFaMIGSMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEjMCEGA1UEAwwaQW1hem9uIFJE\n' - + 'UyBjYS1jZW50cmFsLTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\n' - + 'AQCZYI/iQ6DrS3ny3t1EwX1wAD+3LMgh7Fd01EW5LIuaK2kYIIQpsVKhxLCit/V5\n' - + 'AGc/1qiJS1Qz9ODLTh0Na6bZW6EakRzuHJLe32KJtoFYPC7Z09UqzXrpA/XL+1hM\n' - + 'P0ZmCWsU7Nn/EmvfBp9zX3dZp6P6ATrvDuYaVFr+SA7aT3FXpBroqBS1fyzUPs+W\n' - + 'c6zTR6+yc4zkHX0XQxC5RH6xjgpeRkoOajA/sNo7AQF7KlWmKHbdVF44cvvAhRKZ\n' - + 'XaoVs/C4GjkaAEPTCbopYdhzg+KLx9eB2BQnYLRrIOQZtRfbQI2Nbj7p3VsRuOW1\n' - + 'tlcks2w1Gb0YC6w6SuIMFkl1AgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNV\n' - + 'HRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBToYWxE1lawl6Ks6NsvpbHQ3GKEtzAf\n' - + 'BgNVHSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOC\n' - + 'AQEAG/8tQ0ooi3hoQpa5EJz0/E5VYBsAz3YxA2HoIonn0jJyG16bzB4yZt4vNQMA\n' - + 'KsNlQ1uwDWYL1nz63axieUUFIxqxl1KmwfhsmLgZ0Hd2mnTPIl2Hw3uj5+wdgGBg\n' - + 'agnAZ0bajsBYgD2VGQbqjdk2Qn7Fjy3LEWIvGZx4KyZ99OJ2QxB7JOPdauURAtWA\n' - + 'DKYkP4LLJxtj07DSzG8kuRWb9B47uqUD+eKDIyjfjbnzGtd9HqqzYFau7EX3HVD9\n' - + '9Qhnjl7bTZ6YfAEZ3nH2t3Vc0z76XfGh47rd0pNRhMV+xpok75asKf/lNh5mcUrr\n' - + 'VKwflyMkQpSbDCmcdJ90N2xEXQ==\n' - + '-----END CERTIFICATE-----\n', - - /** - * Amazon RDS eu-west-2 certificate CA 2016 to 2020 - * - * CN = Amazon RDS eu-west-2 CA - * OU = Amazon RDS - * O = Amazon Web Services, Inc. - * L = Seattle - * ST = Washington - * C = US - * P = 2016-10-10T17:44:42Z/2020-03-05T17:44:42Z - * F = 47:79:51:9F:FF:07:D3:F4:27:D3:AB:64:56:7F:00:45:BB:84:C1:71 - */ - '-----BEGIN CERTIFICATE-----\n' - + 'MIID/DCCAuSgAwIBAgIBUDANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' - + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' - + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' - + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjEwMTAxNzQ0NDJaFw0y\n' - + 'MDAzMDUxNzQ0NDJaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' - + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' - + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' - + 'UyBldS13ZXN0LTIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDO\n' - + 'cttLJfubB4XMMIGWNfJISkIdCMGJyOzLiMJaiWB5GYoXKhEl7YGotpy0qklwW3BQ\n' - + 'a0fmVdcCLX+dIuVQ9iFK+ZcK7zwm7HtdDTCHOCKeOh2IcnU4c/VIokFi6Gn8udM6\n' - + 'N/Zi5M5OGpVwLVALQU7Yctsn3c95el6MdVx6mJiIPVu7tCVZn88Z2koBQ2gq9P4O\n' - + 'Sb249SHFqOb03lYDsaqy1NDsznEOhaRBw7DPJFpvmw1lA3/Y6qrExRI06H2VYR2i\n' - + '7qxwDV50N58fs10n7Ye1IOxTVJsgEA7X6EkRRXqYaM39Z76R894548WHfwXWjUsi\n' - + 'MEX0RS0/t1GmnUQjvevDAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' - + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBQBxmcuRSxERYCtNnSr5xNfySokHjAfBgNV\n' - + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOCAQEA\n' - + 'UyCUQjsF3nUAABjfEZmpksTuUo07aT3KGYt+EMMFdejnBQ0+2lJJFGtT+CDAk1SD\n' - + 'RSgfEBon5vvKEtlnTf9a3pv8WXOAkhfxnryr9FH6NiB8obISHNQNPHn0ljT2/T+I\n' - + 'Y6ytfRvKHa0cu3V0NXbJm2B4KEOt4QCDiFxUIX9z6eB4Kditwu05OgQh6KcogOiP\n' - + 'JesWxBMXXGoDC1rIYTFO7szwDyOHlCcVXJDNsTJhc32oDWYdeIbW7o/5I+aQsrXZ\n' - + 'C96HykZcgWzz6sElrQxUaT3IoMw/5nmw4uWKKnZnxgI9bY4fpQwMeBZ96iHfFxvH\n' - + 'mqfEEuC7uUoPofXdBp2ObQ==\n' - + '-----END CERTIFICATE-----\n' - ] -}; - - -/***/ }), -/* 37 */ -/***/ (function(module, exports, __webpack_require__) { - -var Parser = __webpack_require__(38); -var Sequences = __webpack_require__(43); -var Packets = __webpack_require__(2); -var Timers = __webpack_require__(79); -var Stream = __webpack_require__(14).Stream; -var Util = __webpack_require__(0); -var PacketWriter = __webpack_require__(80); - -module.exports = Protocol; -Util.inherits(Protocol, Stream); -function Protocol(options) { - Stream.call(this); - - options = options || {}; - - this.readable = true; - this.writable = true; - - this._config = options.config || {}; - this._connection = options.connection; - this._callback = null; - this._fatalError = null; - this._quitSequence = null; - this._handshake = false; - this._handshaked = false; - this._ended = false; - this._destroyed = false; - this._queue = []; - this._handshakeInitializationPacket = null; - - this._parser = new Parser({ - onError : this.handleParserError.bind(this), - onPacket : this._parsePacket.bind(this), - config : this._config - }); -} - -Protocol.prototype.write = function(buffer) { - this._parser.write(buffer); - return true; -}; - -Protocol.prototype.handshake = function handshake(options, callback) { - if (typeof options === 'function') { - callback = options; - options = {}; - } - - options = options || {}; - options.config = this._config; - - var sequence = this._enqueue(new Sequences.Handshake(options, callback)); - - this._handshake = true; - - return sequence; -}; - -Protocol.prototype.query = function query(options, callback) { - return this._enqueue(new Sequences.Query(options, callback)); -}; - -Protocol.prototype.changeUser = function changeUser(options, callback) { - return this._enqueue(new Sequences.ChangeUser(options, callback)); -}; - -Protocol.prototype.ping = function ping(options, callback) { - if (typeof options === 'function') { - callback = options; - options = {}; - } - - return this._enqueue(new Sequences.Ping(options, callback)); -}; - -Protocol.prototype.stats = function stats(options, callback) { - if (typeof options === 'function') { - callback = options; - options = {}; - } - - return this._enqueue(new Sequences.Statistics(options, callback)); -}; - -Protocol.prototype.quit = function quit(options, callback) { - if (typeof options === 'function') { - callback = options; - options = {}; - } - - var self = this; - var sequence = this._enqueue(new Sequences.Quit(options, callback)); - - sequence.on('end', function () { - self.end(); - }); - - return this._quitSequence = sequence; -}; - -Protocol.prototype.end = function() { - if (this._ended) { - return; - } - this._ended = true; - - if (this._quitSequence && (this._quitSequence._ended || this._queue[0] === this._quitSequence)) { - this._quitSequence.end(); - this.emit('end'); - return; - } - - var err = new Error('Connection lost: The server closed the connection.'); - err.fatal = true; - err.code = 'PROTOCOL_CONNECTION_LOST'; - - this._delegateError(err); -}; - -Protocol.prototype.pause = function() { - this._parser.pause(); - // Since there is a file stream in query, we must transmit pause/resume event to current sequence. - var seq = this._queue[0]; - if (seq && seq.emit) { - seq.emit('pause'); - } -}; - -Protocol.prototype.resume = function() { - this._parser.resume(); - // Since there is a file stream in query, we must transmit pause/resume event to current sequence. - var seq = this._queue[0]; - if (seq && seq.emit) { - seq.emit('resume'); - } -}; - -Protocol.prototype._enqueue = function(sequence) { - if (!this._validateEnqueue(sequence)) { - return sequence; - } - - if (this._config.trace) { - // Long stack trace support - sequence._callSite = sequence._callSite || new Error(); - } - - this._queue.push(sequence); - this.emit('enqueue', sequence); - - var self = this; - sequence - .on('error', function(err) { - self._delegateError(err, sequence); - }) - .on('packet', function(packet) { - Timers.active(sequence); - self._emitPacket(packet); - }) - .on('end', function() { - self._dequeue(sequence); - }) - .on('timeout', function() { - var err = new Error(sequence.constructor.name + ' inactivity timeout'); - - err.code = 'PROTOCOL_SEQUENCE_TIMEOUT'; - err.fatal = true; - err.timeout = sequence._timeout; - - self._delegateError(err, sequence); - }) - .on('start-tls', function() { - Timers.active(sequence); - self._connection._startTLS(function(err) { - if (err) { - // SSL negotiation error are fatal - err.code = 'HANDSHAKE_SSL_ERROR'; - err.fatal = true; - sequence.end(err); - return; - } - - Timers.active(sequence); - sequence._tlsUpgradeCompleteHandler(); - }); - }); - - if (this._queue.length === 1) { - this._parser.resetPacketNumber(); - this._startSequence(sequence); - } - - return sequence; -}; - -Protocol.prototype._validateEnqueue = function _validateEnqueue(sequence) { - var err; - var prefix = 'Cannot enqueue ' + sequence.constructor.name; - - if (this._fatalError) { - err = new Error(prefix + ' after fatal error.'); - err.code = 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR'; - } else if (this._quitSequence) { - err = new Error(prefix + ' after invoking quit.'); - err.code = 'PROTOCOL_ENQUEUE_AFTER_QUIT'; - } else if (this._destroyed) { - err = new Error(prefix + ' after being destroyed.'); - err.code = 'PROTOCOL_ENQUEUE_AFTER_DESTROY'; - } else if ((this._handshake || this._handshaked) && sequence.constructor === Sequences.Handshake) { - err = new Error(prefix + ' after already enqueuing a Handshake.'); - err.code = 'PROTOCOL_ENQUEUE_HANDSHAKE_TWICE'; - } else { - return true; - } - - var self = this; - err.fatal = false; - - // add error handler - sequence.on('error', function (err) { - self._delegateError(err, sequence); - }); - - process.nextTick(function () { - sequence.end(err); - }); - - return false; -}; - -Protocol.prototype._parsePacket = function() { - var sequence = this._queue[0]; - - if (!sequence) { - var err = new Error('Received packet with no active sequence.'); - err.code = 'PROTOCOL_STRAY_PACKET'; - err.fatal = true; - - this._delegateError(err); - return; - } - - var Packet = this._determinePacket(sequence); - var packet = new Packet({protocol41: this._config.protocol41}); - var packetName = Packet.name; - - // Special case: Faster dispatch, and parsing done inside sequence - if (Packet === Packets.RowDataPacket) { - sequence.RowDataPacket(packet, this._parser, this._connection); - - if (this._config.debug) { - this._debugPacket(true, packet); - } - - return; - } - - if (this._config.debug) { - this._parsePacketDebug(packet); - } else { - packet.parse(this._parser); - } - - if (Packet === Packets.HandshakeInitializationPacket) { - this._handshakeInitializationPacket = packet; - } - - Timers.active(sequence); - - if (!sequence[packetName]) { - var err = new Error('Received packet in the wrong sequence.'); - err.code = 'PROTOCOL_INCORRECT_PACKET_SEQUENCE'; - err.fatal = true; - - this._delegateError(err); - return; - } - - sequence[packetName](packet); -}; - -Protocol.prototype._parsePacketDebug = function _parsePacketDebug(packet) { - try { - packet.parse(this._parser); - } finally { - this._debugPacket(true, packet); - } -}; - -Protocol.prototype._emitPacket = function(packet) { - var packetWriter = new PacketWriter(); - packet.write(packetWriter); - this.emit('data', packetWriter.toBuffer(this._parser)); - - if (this._config.debug) { - this._debugPacket(false, packet); - } -}; - -Protocol.prototype._determinePacket = function(sequence) { - var firstByte = this._parser.peak(); - - if (sequence.determinePacket) { - var Packet = sequence.determinePacket(firstByte, this._parser); - if (Packet) { - return Packet; - } - } - - switch (firstByte) { - case 0x00: - if (!this._handshaked) { - this._handshaked = true; - this.emit('handshake', this._handshakeInitializationPacket); - } - return Packets.OkPacket; - case 0xfe: return Packets.EofPacket; - case 0xff: return Packets.ErrorPacket; - } - - throw new Error('Could not determine packet, firstByte = ' + firstByte); -}; - -Protocol.prototype._dequeue = function(sequence) { - Timers.unenroll(sequence); - - // No point in advancing the queue, we are dead - if (this._fatalError) { - return; - } - - this._queue.shift(); - - var sequence = this._queue[0]; - if (!sequence) { - this.emit('drain'); - return; - } - - this._parser.resetPacketNumber(); - - this._startSequence(sequence); -}; - -Protocol.prototype._startSequence = function(sequence) { - if (sequence._timeout > 0 && isFinite(sequence._timeout)) { - Timers.enroll(sequence, sequence._timeout); - Timers.active(sequence); - } - - if (sequence.constructor === Sequences.ChangeUser) { - sequence.start(this._handshakeInitializationPacket); - } else { - sequence.start(); - } -}; - -Protocol.prototype.handleNetworkError = function(err) { - err.fatal = true; - - var sequence = this._queue[0]; - if (sequence) { - sequence.end(err); - } else { - this._delegateError(err); - } -}; - -Protocol.prototype.handleParserError = function handleParserError(err) { - var sequence = this._queue[0]; - if (sequence) { - sequence.end(err); - } else { - this._delegateError(err); - } -}; - -Protocol.prototype._delegateError = function(err, sequence) { - // Stop delegating errors after the first fatal error - if (this._fatalError) { - return; - } - - if (err.fatal) { - this._fatalError = err; - } - - if (this._shouldErrorBubbleUp(err, sequence)) { - // Can't use regular 'error' event here as that always destroys the pipe - // between socket and protocol which is not what we want (unless the - // exception was fatal). - this.emit('unhandledError', err); - } else if (err.fatal) { - // Send fatal error to all sequences in the queue - var queue = this._queue; - process.nextTick(function () { - queue.forEach(function (sequence) { - sequence.end(err); - }); - queue.length = 0; - }); - } - - // Make sure the stream we are piping to is getting closed - if (err.fatal) { - this.emit('end', err); - } -}; - -Protocol.prototype._shouldErrorBubbleUp = function(err, sequence) { - if (sequence) { - if (sequence.hasErrorHandler()) { - return false; - } else if (!err.fatal) { - return true; - } - } - - return (err.fatal && !this._hasPendingErrorHandlers()); -}; - -Protocol.prototype._hasPendingErrorHandlers = function() { - return this._queue.some(function(sequence) { - return sequence.hasErrorHandler(); - }); -}; - -Protocol.prototype.destroy = function() { - this._destroyed = true; - this._parser.pause(); - - if (this._connection.state !== 'disconnected') { - if (!this._ended) { - this.end(); - } - } -}; - -Protocol.prototype._debugPacket = function(incoming, packet) { - var headline = (incoming) - ? '<-- ' - : '--> '; - - headline = headline + packet.constructor.name; - - // check for debug packet restriction - if (Array.isArray(this._config.debug) && this._config.debug.indexOf(packet.constructor.name) === -1) { - return; - } - - console.log(headline); - console.log(packet); - console.log(''); -}; - - -/***/ }), -/* 38 */ -/***/ (function(module, exports, __webpack_require__) { - -var MAX_PACKET_LENGTH = Math.pow(2, 24) - 1; -var MUL_32BIT = Math.pow(2, 32); -var PacketHeader = __webpack_require__(39); -var BigNumber = __webpack_require__(40); -var Buffer = __webpack_require__(1).Buffer; -var BufferList = __webpack_require__(42); - -module.exports = Parser; -function Parser(options) { - options = options || {}; - - this._supportBigNumbers = options.config && options.config.supportBigNumbers; - this._buffer = Buffer.alloc(0); - this._nextBuffers = new BufferList(); - this._longPacketBuffers = new BufferList(); - this._offset = 0; - this._packetEnd = null; - this._packetHeader = null; - this._packetOffset = null; - this._onError = options.onError || function(err) { throw err; }; - this._onPacket = options.onPacket || function() {}; - this._nextPacketNumber = 0; - this._encoding = 'utf-8'; - this._paused = false; -} - -Parser.prototype.write = function write(chunk) { - this._nextBuffers.push(chunk); - - while (!this._paused) { - if (!this._packetHeader) { - if (!this._combineNextBuffers(4)) { - break; - } - - this._packetHeader = new PacketHeader( - this.parseUnsignedNumber(3), - this.parseUnsignedNumber(1) - ); - - if (this._packetHeader.number !== this._nextPacketNumber) { - var err = new Error( - 'Packets out of order. Got: ' + this._packetHeader.number + ' ' + - 'Expected: ' + this._nextPacketNumber - ); - - err.code = 'PROTOCOL_PACKETS_OUT_OF_ORDER'; - err.fatal = true; - - this._onError(err); - } - - this.incrementPacketNumber(); - } - - if (!this._combineNextBuffers(this._packetHeader.length)) { - break; - } - - this._packetEnd = this._offset + this._packetHeader.length; - this._packetOffset = this._offset; - - if (this._packetHeader.length === MAX_PACKET_LENGTH) { - this._longPacketBuffers.push(this._buffer.slice(this._packetOffset, this._packetEnd)); - - this._advanceToNextPacket(); - continue; - } - - this._combineLongPacketBuffers(); - - // Try...finally to ensure exception safety. Unfortunately this is costing - // us up to ~10% performance in some benchmarks. - var hadException = true; - try { - this._onPacket(this._packetHeader); - hadException = false; - } catch (err) { - if (!err || typeof err.code !== 'string' || err.code.substr(0, 7) !== 'PARSER_') { - throw err; // Rethrow non-MySQL errors - } - - // Pass down parser errors - this._onError(err); - hadException = false; - } finally { - this._advanceToNextPacket(); - - // If we had an exception, the parser while loop will be broken out - // of after the finally block. So we need to make sure to re-enter it - // to continue parsing any bytes that may already have been received. - if (hadException) { - process.nextTick(this.write.bind(this)); - } - } - } -}; - -Parser.prototype.append = function append(chunk) { - if (!chunk || chunk.length === 0) { - return; - } - - // Calculate slice ranges - var sliceEnd = this._buffer.length; - var sliceStart = this._packetOffset === null - ? this._offset - : this._packetOffset; - var sliceLength = sliceEnd - sliceStart; - - // Get chunk data - var buffer = null; - var chunks = !(chunk instanceof Array || Array.isArray(chunk)) ? [chunk] : chunk; - var length = 0; - var offset = 0; - - for (var i = 0; i < chunks.length; i++) { - length += chunks[i].length; - } - - if (sliceLength !== 0) { - // Create a new Buffer - buffer = Buffer.allocUnsafe(sliceLength + length); - offset = 0; - - // Copy data slice - offset += this._buffer.copy(buffer, 0, sliceStart, sliceEnd); - - // Copy chunks - for (var i = 0; i < chunks.length; i++) { - offset += chunks[i].copy(buffer, offset); - } - } else if (chunks.length > 1) { - // Create a new Buffer - buffer = Buffer.allocUnsafe(length); - offset = 0; - - // Copy chunks - for (var i = 0; i < chunks.length; i++) { - offset += chunks[i].copy(buffer, offset); - } - } else { - // Buffer is the only chunk - buffer = chunks[0]; - } - - // Adjust data-tracking pointers - this._buffer = buffer; - this._offset = this._offset - sliceStart; - this._packetEnd = this._packetEnd !== null - ? this._packetEnd - sliceStart - : null; - this._packetOffset = this._packetOffset !== null - ? this._packetOffset - sliceStart - : null; -}; - -Parser.prototype.pause = function() { - this._paused = true; -}; - -Parser.prototype.resume = function() { - this._paused = false; - - // nextTick() to avoid entering write() multiple times within the same stack - // which would cause problems as write manipulates the state of the object. - process.nextTick(this.write.bind(this)); -}; - -Parser.prototype.peak = function() { - return this._buffer[this._offset]; -}; - -Parser.prototype.parseUnsignedNumber = function parseUnsignedNumber(bytes) { - if (bytes === 1) { - return this._buffer[this._offset++]; - } - - var buffer = this._buffer; - var offset = this._offset + bytes - 1; - var value = 0; - - if (bytes > 4) { - var err = new Error('parseUnsignedNumber: Supports only up to 4 bytes'); - err.offset = (this._offset - this._packetOffset - 1); - err.code = 'PARSER_UNSIGNED_TOO_LONG'; - throw err; - } - - while (offset >= this._offset) { - value = ((value << 8) | buffer[offset]) >>> 0; - offset--; - } - - this._offset += bytes; - - return value; -}; - -Parser.prototype.parseLengthCodedString = function() { - var length = this.parseLengthCodedNumber(); - - if (length === null) { - return null; - } - - return this.parseString(length); -}; - -Parser.prototype.parseLengthCodedBuffer = function() { - var length = this.parseLengthCodedNumber(); - - if (length === null) { - return null; - } - - return this.parseBuffer(length); -}; - -Parser.prototype.parseLengthCodedNumber = function parseLengthCodedNumber() { - if (this._offset >= this._buffer.length) { - var err = new Error('Parser: read past end'); - err.offset = (this._offset - this._packetOffset); - err.code = 'PARSER_READ_PAST_END'; - throw err; - } - - var bits = this._buffer[this._offset++]; - - if (bits <= 250) { - return bits; - } - - switch (bits) { - case 251: - return null; - case 252: - return this.parseUnsignedNumber(2); - case 253: - return this.parseUnsignedNumber(3); - case 254: - break; - default: - var err = new Error('Unexpected first byte' + (bits ? ': 0x' + bits.toString(16) : '')); - err.offset = (this._offset - this._packetOffset - 1); - err.code = 'PARSER_BAD_LENGTH_BYTE'; - throw err; - } - - var low = this.parseUnsignedNumber(4); - var high = this.parseUnsignedNumber(4); - var value; - - if (high >>> 21) { - value = (new BigNumber(low)).plus((new BigNumber(MUL_32BIT)).times(high)).toString(); - - if (this._supportBigNumbers) { - return value; - } - - var err = new Error( - 'parseLengthCodedNumber: JS precision range exceeded, ' + - 'number is >= 53 bit: "' + value + '"' - ); - err.offset = (this._offset - this._packetOffset - 8); - err.code = 'PARSER_JS_PRECISION_RANGE_EXCEEDED'; - throw err; - } - - value = low + (MUL_32BIT * high); - - return value; -}; - -Parser.prototype.parseFiller = function(length) { - return this.parseBuffer(length); -}; - -Parser.prototype.parseNullTerminatedBuffer = function() { - var end = this._nullByteOffset(); - var value = this._buffer.slice(this._offset, end); - this._offset = end + 1; - - return value; -}; - -Parser.prototype.parseNullTerminatedString = function() { - var end = this._nullByteOffset(); - var value = this._buffer.toString(this._encoding, this._offset, end); - this._offset = end + 1; - - return value; -}; - -Parser.prototype._nullByteOffset = function() { - var offset = this._offset; - - while (this._buffer[offset] !== 0x00) { - offset++; - - if (offset >= this._buffer.length) { - var err = new Error('Offset of null terminated string not found.'); - err.offset = (this._offset - this._packetOffset); - err.code = 'PARSER_MISSING_NULL_BYTE'; - throw err; - } - } - - return offset; -}; - -Parser.prototype.parsePacketTerminatedBuffer = function parsePacketTerminatedBuffer() { - var length = this._packetEnd - this._offset; - return this.parseBuffer(length); -}; - -Parser.prototype.parsePacketTerminatedString = function() { - var length = this._packetEnd - this._offset; - return this.parseString(length); -}; - -Parser.prototype.parseBuffer = function(length) { - var response = Buffer.alloc(length); - this._buffer.copy(response, 0, this._offset, this._offset + length); - - this._offset += length; - return response; -}; - -Parser.prototype.parseString = function(length) { - var offset = this._offset; - var end = offset + length; - var value = this._buffer.toString(this._encoding, offset, end); - - this._offset = end; - return value; -}; - -Parser.prototype.parseGeometryValue = function() { - var buffer = this.parseLengthCodedBuffer(); - var offset = 4; - - if (buffer === null || !buffer.length) { - return null; - } - - function parseGeometry() { - var result = null; - var byteOrder = buffer.readUInt8(offset); offset += 1; - var wkbType = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; - switch (wkbType) { - case 1: // WKBPoint - var x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - var y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - result = {x: x, y: y}; - break; - case 2: // WKBLineString - var numPoints = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; - result = []; - for (var i = numPoints; i > 0; i--) { - var x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - var y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - result.push({x: x, y: y}); - } - break; - case 3: // WKBPolygon - var numRings = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; - result = []; - for (var i = numRings; i > 0; i--) { - var numPoints = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; - var line = []; - for (var j = numPoints; j > 0; j--) { - var x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - var y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; - line.push({x: x, y: y}); - } - result.push(line); - } - break; - case 4: // WKBMultiPoint - case 5: // WKBMultiLineString - case 6: // WKBMultiPolygon - case 7: // WKBGeometryCollection - var num = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; - var result = []; - for (var i = num; i > 0; i--) { - result.push(parseGeometry()); - } - break; - } - return result; - } - return parseGeometry(); -}; - -Parser.prototype.reachedPacketEnd = function() { - return this._offset === this._packetEnd; -}; - -Parser.prototype.incrementPacketNumber = function() { - var currentPacketNumber = this._nextPacketNumber; - this._nextPacketNumber = (this._nextPacketNumber + 1) % 256; - - return currentPacketNumber; -}; - -Parser.prototype.resetPacketNumber = function() { - this._nextPacketNumber = 0; -}; - -Parser.prototype.packetLength = function packetLength() { - if (!this._packetHeader) { - return null; - } - - return this._packetHeader.length + this._longPacketBuffers.size; -}; - -Parser.prototype._combineNextBuffers = function _combineNextBuffers(bytes) { - var length = this._buffer.length - this._offset; - - if (length >= bytes) { - return true; - } - - if ((length + this._nextBuffers.size) < bytes) { - return false; - } - - var buffers = []; - var bytesNeeded = bytes - length; - - while (bytesNeeded > 0) { - var buffer = this._nextBuffers.shift(); - buffers.push(buffer); - bytesNeeded -= buffer.length; - } - - this.append(buffers); - return true; -}; - -Parser.prototype._combineLongPacketBuffers = function _combineLongPacketBuffers() { - if (!this._longPacketBuffers.size) { - return; - } - - // Calculate bytes - var remainingBytes = this._buffer.length - this._offset; - var trailingPacketBytes = this._buffer.length - this._packetEnd; - - // Create buffer - var buf = null; - var buffer = Buffer.allocUnsafe(remainingBytes + this._longPacketBuffers.size); - var offset = 0; - - // Copy long buffers - while ((buf = this._longPacketBuffers.shift())) { - offset += buf.copy(buffer, offset); - } - - // Copy remaining bytes - this._buffer.copy(buffer, offset, this._offset); - - this._buffer = buffer; - this._offset = 0; - this._packetEnd = this._buffer.length - trailingPacketBytes; - this._packetOffset = 0; -}; - -Parser.prototype._advanceToNextPacket = function() { - this._offset = this._packetEnd; - this._packetHeader = null; - this._packetEnd = null; - this._packetOffset = null; -}; - - -/***/ }), -/* 39 */ -/***/ (function(module, exports) { - -module.exports = PacketHeader; -function PacketHeader(length, number) { - this.length = length; - this.number = number; -} - - -/***/ }), -/* 40 */ -/***/ (function(module, exports, __webpack_require__) { - -var __WEBPACK_AMD_DEFINE_RESULT__;/*! bignumber.js v4.0.4 https://github.com/MikeMcl/bignumber.js/LICENCE */ - -;(function (globalObj) { - 'use strict'; - - /* - bignumber.js v4.0.4 - A JavaScript library for arbitrary-precision arithmetic. - https://github.com/MikeMcl/bignumber.js - Copyright (c) 2017 Michael Mclaughlin - MIT Expat Licence - */ - - - var BigNumber, - isNumeric = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, - mathceil = Math.ceil, - mathfloor = Math.floor, - notBool = ' not a boolean or binary digit', - roundingMode = 'rounding mode', - tooManyDigits = 'number type has more than 15 significant digits', - ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_', - BASE = 1e14, - LOG_BASE = 14, - MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1 - // MAX_INT32 = 0x7fffffff, // 2^31 - 1 - POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13], - SQRT_BASE = 1e7, - - /* - * The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and - * the arguments to toExponential, toFixed, toFormat, and toPrecision, beyond which an - * exception is thrown (if ERRORS is true). - */ - MAX = 1E9; // 0 to MAX_INT32 - - - /* - * Create and return a BigNumber constructor. - */ - function constructorFactory(config) { - var div, parseNumeric, - - // id tracks the caller function, so its name can be included in error messages. - id = 0, - P = BigNumber.prototype, - ONE = new BigNumber(1), - - - /********************************* EDITABLE DEFAULTS **********************************/ - - - /* - * The default values below must be integers within the inclusive ranges stated. - * The values can also be changed at run-time using BigNumber.config. - */ - - // The maximum number of decimal places for operations involving division. - DECIMAL_PLACES = 20, // 0 to MAX - - /* - * The rounding mode used when rounding to the above decimal places, and when using - * toExponential, toFixed, toFormat and toPrecision, and round (default value). - * UP 0 Away from zero. - * DOWN 1 Towards zero. - * CEIL 2 Towards +Infinity. - * FLOOR 3 Towards -Infinity. - * HALF_UP 4 Towards nearest neighbour. If equidistant, up. - * HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. - * HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. - * HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. - * HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. - */ - ROUNDING_MODE = 4, // 0 to 8 - - // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS] - - // The exponent value at and beneath which toString returns exponential notation. - // Number type: -7 - TO_EXP_NEG = -7, // 0 to -MAX - - // The exponent value at and above which toString returns exponential notation. - // Number type: 21 - TO_EXP_POS = 21, // 0 to MAX - - // RANGE : [MIN_EXP, MAX_EXP] - - // The minimum exponent value, beneath which underflow to zero occurs. - // Number type: -324 (5e-324) - MIN_EXP = -1e7, // -1 to -MAX - - // The maximum exponent value, above which overflow to Infinity occurs. - // Number type: 308 (1.7976931348623157e+308) - // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow. - MAX_EXP = 1e7, // 1 to MAX - - // Whether BigNumber Errors are ever thrown. - ERRORS = true, // true or false - - // Change to intValidatorNoErrors if ERRORS is false. - isValidInt = intValidatorWithErrors, // intValidatorWithErrors/intValidatorNoErrors - - // Whether to use cryptographically-secure random number generation, if available. - CRYPTO = false, // true or false - - /* - * The modulo mode used when calculating the modulus: a mod n. - * The quotient (q = a / n) is calculated according to the corresponding rounding mode. - * The remainder (r) is calculated as: r = a - n * q. - * - * UP 0 The remainder is positive if the dividend is negative, else is negative. - * DOWN 1 The remainder has the same sign as the dividend. - * This modulo mode is commonly known as 'truncated division' and is - * equivalent to (a % n) in JavaScript. - * FLOOR 3 The remainder has the same sign as the divisor (Python %). - * HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function. - * EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). - * The remainder is always positive. - * - * The truncated division, floored division, Euclidian division and IEEE 754 remainder - * modes are commonly used for the modulus operation. - * Although the other rounding modes can also be used, they may not give useful results. - */ - MODULO_MODE = 1, // 0 to 9 - - // The maximum number of significant digits of the result of the toPower operation. - // If POW_PRECISION is 0, there will be unlimited significant digits. - POW_PRECISION = 0, // 0 to MAX - - // The format specification used by the BigNumber.prototype.toFormat method. - FORMAT = { - decimalSeparator: '.', - groupSeparator: ',', - groupSize: 3, - secondaryGroupSize: 0, - fractionGroupSeparator: '\xA0', // non-breaking space - fractionGroupSize: 0 - }; - - - /******************************************************************************************/ - - - // CONSTRUCTOR - - - /* - * The BigNumber constructor and exported function. - * Create and return a new instance of a BigNumber object. - * - * n {number|string|BigNumber} A numeric value. - * [b] {number} The base of n. Integer, 2 to 64 inclusive. - */ - function BigNumber( n, b ) { - var c, e, i, num, len, str, - x = this; - - // Enable constructor usage without new. - if ( !( x instanceof BigNumber ) ) { - - // 'BigNumber() constructor call without new: {n}' - if (ERRORS) raise( 26, 'constructor call without new', n ); - return new BigNumber( n, b ); - } - - // 'new BigNumber() base not an integer: {b}' - // 'new BigNumber() base out of range: {b}' - if ( b == null || !isValidInt( b, 2, 64, id, 'base' ) ) { - - // Duplicate. - if ( n instanceof BigNumber ) { - x.s = n.s; - x.e = n.e; - x.c = ( n = n.c ) ? n.slice() : n; - id = 0; - return; - } - - if ( ( num = typeof n == 'number' ) && n * 0 == 0 ) { - x.s = 1 / n < 0 ? ( n = -n, -1 ) : 1; - - // Fast path for integers. - if ( n === ~~n ) { - for ( e = 0, i = n; i >= 10; i /= 10, e++ ); - x.e = e; - x.c = [n]; - id = 0; - return; - } - - str = n + ''; - } else { - if ( !isNumeric.test( str = n + '' ) ) return parseNumeric( x, str, num ); - x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1; - } - } else { - b = b | 0; - str = n + ''; - - // Ensure return value is rounded to DECIMAL_PLACES as with other bases. - // Allow exponential notation to be used with base 10 argument. - if ( b == 10 ) { - x = new BigNumber( n instanceof BigNumber ? n : str ); - return round( x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE ); - } - - // Avoid potential interpretation of Infinity and NaN as base 44+ values. - // Any number in exponential form will fail due to the [Ee][+-]. - if ( ( num = typeof n == 'number' ) && n * 0 != 0 || - !( new RegExp( '^-?' + ( c = '[' + ALPHABET.slice( 0, b ) + ']+' ) + - '(?:\\.' + c + ')?$',b < 37 ? 'i' : '' ) ).test(str) ) { - return parseNumeric( x, str, num, b ); - } - - if (num) { - x.s = 1 / n < 0 ? ( str = str.slice(1), -1 ) : 1; - - if ( ERRORS && str.replace( /^0\.0*|\./, '' ).length > 15 ) { - - // 'new BigNumber() number type has more than 15 significant digits: {n}' - raise( id, tooManyDigits, n ); - } - - // Prevent later check for length on converted number. - num = false; - } else { - x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1; - } - - str = convertBase( str, 10, b, x.s ); - } - - // Decimal point? - if ( ( e = str.indexOf('.') ) > -1 ) str = str.replace( '.', '' ); - - // Exponential form? - if ( ( i = str.search( /e/i ) ) > 0 ) { - - // Determine exponent. - if ( e < 0 ) e = i; - e += +str.slice( i + 1 ); - str = str.substring( 0, i ); - } else if ( e < 0 ) { - - // Integer. - e = str.length; - } - - // Determine leading zeros. - for ( i = 0; str.charCodeAt(i) === 48; i++ ); - - // Determine trailing zeros. - for ( len = str.length; str.charCodeAt(--len) === 48; ); - str = str.slice( i, len + 1 ); - - if (str) { - len = str.length; - - // Disallow numbers with over 15 significant digits if number type. - // 'new BigNumber() number type has more than 15 significant digits: {n}' - if ( num && ERRORS && len > 15 && ( n > MAX_SAFE_INTEGER || n !== mathfloor(n) ) ) { - raise( id, tooManyDigits, x.s * n ); - } - - e = e - i - 1; - - // Overflow? - if ( e > MAX_EXP ) { - - // Infinity. - x.c = x.e = null; - - // Underflow? - } else if ( e < MIN_EXP ) { - - // Zero. - x.c = [ x.e = 0 ]; - } else { - x.e = e; - x.c = []; - - // Transform base - - // e is the base 10 exponent. - // i is where to slice str to get the first element of the coefficient array. - i = ( e + 1 ) % LOG_BASE; - if ( e < 0 ) i += LOG_BASE; - - if ( i < len ) { - if (i) x.c.push( +str.slice( 0, i ) ); - - for ( len -= LOG_BASE; i < len; ) { - x.c.push( +str.slice( i, i += LOG_BASE ) ); - } - - str = str.slice(i); - i = LOG_BASE - str.length; - } else { - i -= len; - } - - for ( ; i--; str += '0' ); - x.c.push( +str ); - } - } else { - - // Zero. - x.c = [ x.e = 0 ]; - } - - id = 0; - } - - - // CONSTRUCTOR PROPERTIES - - - BigNumber.another = constructorFactory; - - BigNumber.ROUND_UP = 0; - BigNumber.ROUND_DOWN = 1; - BigNumber.ROUND_CEIL = 2; - BigNumber.ROUND_FLOOR = 3; - BigNumber.ROUND_HALF_UP = 4; - BigNumber.ROUND_HALF_DOWN = 5; - BigNumber.ROUND_HALF_EVEN = 6; - BigNumber.ROUND_HALF_CEIL = 7; - BigNumber.ROUND_HALF_FLOOR = 8; - BigNumber.EUCLID = 9; - - - /* - * Configure infrequently-changing library-wide settings. - * - * Accept an object or an argument list, with one or many of the following properties or - * parameters respectively: - * - * DECIMAL_PLACES {number} Integer, 0 to MAX inclusive - * ROUNDING_MODE {number} Integer, 0 to 8 inclusive - * EXPONENTIAL_AT {number|number[]} Integer, -MAX to MAX inclusive or - * [integer -MAX to 0 incl., 0 to MAX incl.] - * RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or - * [integer -MAX to -1 incl., integer 1 to MAX incl.] - * ERRORS {boolean|number} true, false, 1 or 0 - * CRYPTO {boolean|number} true, false, 1 or 0 - * MODULO_MODE {number} 0 to 9 inclusive - * POW_PRECISION {number} 0 to MAX inclusive - * FORMAT {object} See BigNumber.prototype.toFormat - * decimalSeparator {string} - * groupSeparator {string} - * groupSize {number} - * secondaryGroupSize {number} - * fractionGroupSeparator {string} - * fractionGroupSize {number} - * - * (The values assigned to the above FORMAT object properties are not checked for validity.) - * - * E.g. - * BigNumber.config(20, 4) is equivalent to - * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 }) - * - * Ignore properties/parameters set to null or undefined. - * Return an object with the properties current values. - */ - BigNumber.config = BigNumber.set = function () { - var v, p, - i = 0, - r = {}, - a = arguments, - o = a[0], - has = o && typeof o == 'object' - ? function () { if ( o.hasOwnProperty(p) ) return ( v = o[p] ) != null; } - : function () { if ( a.length > i ) return ( v = a[i++] ) != null; }; - - // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive. - // 'config() DECIMAL_PLACES not an integer: {v}' - // 'config() DECIMAL_PLACES out of range: {v}' - if ( has( p = 'DECIMAL_PLACES' ) && isValidInt( v, 0, MAX, 2, p ) ) { - DECIMAL_PLACES = v | 0; - } - r[p] = DECIMAL_PLACES; - - // ROUNDING_MODE {number} Integer, 0 to 8 inclusive. - // 'config() ROUNDING_MODE not an integer: {v}' - // 'config() ROUNDING_MODE out of range: {v}' - if ( has( p = 'ROUNDING_MODE' ) && isValidInt( v, 0, 8, 2, p ) ) { - ROUNDING_MODE = v | 0; - } - r[p] = ROUNDING_MODE; - - // EXPONENTIAL_AT {number|number[]} - // Integer, -MAX to MAX inclusive or [integer -MAX to 0 inclusive, 0 to MAX inclusive]. - // 'config() EXPONENTIAL_AT not an integer: {v}' - // 'config() EXPONENTIAL_AT out of range: {v}' - if ( has( p = 'EXPONENTIAL_AT' ) ) { - - if ( isArray(v) ) { - if ( isValidInt( v[0], -MAX, 0, 2, p ) && isValidInt( v[1], 0, MAX, 2, p ) ) { - TO_EXP_NEG = v[0] | 0; - TO_EXP_POS = v[1] | 0; - } - } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) { - TO_EXP_NEG = -( TO_EXP_POS = ( v < 0 ? -v : v ) | 0 ); - } - } - r[p] = [ TO_EXP_NEG, TO_EXP_POS ]; - - // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or - // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive]. - // 'config() RANGE not an integer: {v}' - // 'config() RANGE cannot be zero: {v}' - // 'config() RANGE out of range: {v}' - if ( has( p = 'RANGE' ) ) { - - if ( isArray(v) ) { - if ( isValidInt( v[0], -MAX, -1, 2, p ) && isValidInt( v[1], 1, MAX, 2, p ) ) { - MIN_EXP = v[0] | 0; - MAX_EXP = v[1] | 0; - } - } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) { - if ( v | 0 ) MIN_EXP = -( MAX_EXP = ( v < 0 ? -v : v ) | 0 ); - else if (ERRORS) raise( 2, p + ' cannot be zero', v ); - } - } - r[p] = [ MIN_EXP, MAX_EXP ]; - - // ERRORS {boolean|number} true, false, 1 or 0. - // 'config() ERRORS not a boolean or binary digit: {v}' - if ( has( p = 'ERRORS' ) ) { - - if ( v === !!v || v === 1 || v === 0 ) { - id = 0; - isValidInt = ( ERRORS = !!v ) ? intValidatorWithErrors : intValidatorNoErrors; - } else if (ERRORS) { - raise( 2, p + notBool, v ); - } - } - r[p] = ERRORS; - - // CRYPTO {boolean|number} true, false, 1 or 0. - // 'config() CRYPTO not a boolean or binary digit: {v}' - // 'config() crypto unavailable: {crypto}' - if ( has( p = 'CRYPTO' ) ) { - - if ( v === true || v === false || v === 1 || v === 0 ) { - if (v) { - v = typeof crypto == 'undefined'; - if ( !v && crypto && (crypto.getRandomValues || crypto.randomBytes)) { - CRYPTO = true; - } else if (ERRORS) { - raise( 2, 'crypto unavailable', v ? void 0 : crypto ); - } else { - CRYPTO = false; - } - } else { - CRYPTO = false; - } - } else if (ERRORS) { - raise( 2, p + notBool, v ); - } - } - r[p] = CRYPTO; - - // MODULO_MODE {number} Integer, 0 to 9 inclusive. - // 'config() MODULO_MODE not an integer: {v}' - // 'config() MODULO_MODE out of range: {v}' - if ( has( p = 'MODULO_MODE' ) && isValidInt( v, 0, 9, 2, p ) ) { - MODULO_MODE = v | 0; - } - r[p] = MODULO_MODE; - - // POW_PRECISION {number} Integer, 0 to MAX inclusive. - // 'config() POW_PRECISION not an integer: {v}' - // 'config() POW_PRECISION out of range: {v}' - if ( has( p = 'POW_PRECISION' ) && isValidInt( v, 0, MAX, 2, p ) ) { - POW_PRECISION = v | 0; - } - r[p] = POW_PRECISION; - - // FORMAT {object} - // 'config() FORMAT not an object: {v}' - if ( has( p = 'FORMAT' ) ) { - - if ( typeof v == 'object' ) { - FORMAT = v; - } else if (ERRORS) { - raise( 2, p + ' not an object', v ); - } - } - r[p] = FORMAT; - - return r; - }; - - - /* - * Return a new BigNumber whose value is the maximum of the arguments. - * - * arguments {number|string|BigNumber} - */ - BigNumber.max = function () { return maxOrMin( arguments, P.lt ); }; - - - /* - * Return a new BigNumber whose value is the minimum of the arguments. - * - * arguments {number|string|BigNumber} - */ - BigNumber.min = function () { return maxOrMin( arguments, P.gt ); }; - - - /* - * Return a new BigNumber with a random value equal to or greater than 0 and less than 1, - * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing - * zeros are produced). - * - * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. - * - * 'random() decimal places not an integer: {dp}' - * 'random() decimal places out of range: {dp}' - * 'random() crypto unavailable: {crypto}' - */ - BigNumber.random = (function () { - var pow2_53 = 0x20000000000000; - - // Return a 53 bit integer n, where 0 <= n < 9007199254740992. - // Check if Math.random() produces more than 32 bits of randomness. - // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits. - // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1. - var random53bitInt = (Math.random() * pow2_53) & 0x1fffff - ? function () { return mathfloor( Math.random() * pow2_53 ); } - : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) + - (Math.random() * 0x800000 | 0); }; - - return function (dp) { - var a, b, e, k, v, - i = 0, - c = [], - rand = new BigNumber(ONE); - - dp = dp == null || !isValidInt( dp, 0, MAX, 14 ) ? DECIMAL_PLACES : dp | 0; - k = mathceil( dp / LOG_BASE ); - - if (CRYPTO) { - - // Browsers supporting crypto.getRandomValues. - if (crypto.getRandomValues) { - - a = crypto.getRandomValues( new Uint32Array( k *= 2 ) ); - - for ( ; i < k; ) { - - // 53 bits: - // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2) - // 11111 11111111 11111111 11111111 11100000 00000000 00000000 - // ((Math.pow(2, 32) - 1) >>> 11).toString(2) - // 11111 11111111 11111111 - // 0x20000 is 2^21. - v = a[i] * 0x20000 + (a[i + 1] >>> 11); - - // Rejection sampling: - // 0 <= v < 9007199254740992 - // Probability that v >= 9e15, is - // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251 - if ( v >= 9e15 ) { - b = crypto.getRandomValues( new Uint32Array(2) ); - a[i] = b[0]; - a[i + 1] = b[1]; - } else { - - // 0 <= v <= 8999999999999999 - // 0 <= (v % 1e14) <= 99999999999999 - c.push( v % 1e14 ); - i += 2; - } - } - i = k / 2; - - // Node.js supporting crypto.randomBytes. - } else if (crypto.randomBytes) { - - // buffer - a = crypto.randomBytes( k *= 7 ); - - for ( ; i < k; ) { - - // 0x1000000000000 is 2^48, 0x10000000000 is 2^40 - // 0x100000000 is 2^32, 0x1000000 is 2^24 - // 11111 11111111 11111111 11111111 11111111 11111111 11111111 - // 0 <= v < 9007199254740992 - v = ( ( a[i] & 31 ) * 0x1000000000000 ) + ( a[i + 1] * 0x10000000000 ) + - ( a[i + 2] * 0x100000000 ) + ( a[i + 3] * 0x1000000 ) + - ( a[i + 4] << 16 ) + ( a[i + 5] << 8 ) + a[i + 6]; - - if ( v >= 9e15 ) { - crypto.randomBytes(7).copy( a, i ); - } else { - - // 0 <= (v % 1e14) <= 99999999999999 - c.push( v % 1e14 ); - i += 7; - } - } - i = k / 7; - } else { - CRYPTO = false; - if (ERRORS) raise( 14, 'crypto unavailable', crypto ); - } - } - - // Use Math.random. - if (!CRYPTO) { - - for ( ; i < k; ) { - v = random53bitInt(); - if ( v < 9e15 ) c[i++] = v % 1e14; - } - } - - k = c[--i]; - dp %= LOG_BASE; - - // Convert trailing digits to zeros according to dp. - if ( k && dp ) { - v = POWS_TEN[LOG_BASE - dp]; - c[i] = mathfloor( k / v ) * v; - } - - // Remove trailing elements which are zero. - for ( ; c[i] === 0; c.pop(), i-- ); - - // Zero? - if ( i < 0 ) { - c = [ e = 0 ]; - } else { - - // Remove leading elements which are zero and adjust exponent accordingly. - for ( e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE); - - // Count the digits of the first element of c to determine leading zeros, and... - for ( i = 1, v = c[0]; v >= 10; v /= 10, i++); - - // adjust the exponent accordingly. - if ( i < LOG_BASE ) e -= LOG_BASE - i; - } - - rand.e = e; - rand.c = c; - return rand; - }; - })(); - - - // PRIVATE FUNCTIONS - - - // Convert a numeric string of baseIn to a numeric string of baseOut. - function convertBase( str, baseOut, baseIn, sign ) { - var d, e, k, r, x, xc, y, - i = str.indexOf( '.' ), - dp = DECIMAL_PLACES, - rm = ROUNDING_MODE; - - if ( baseIn < 37 ) str = str.toLowerCase(); - - // Non-integer. - if ( i >= 0 ) { - k = POW_PRECISION; - - // Unlimited precision. - POW_PRECISION = 0; - str = str.replace( '.', '' ); - y = new BigNumber(baseIn); - x = y.pow( str.length - i ); - POW_PRECISION = k; - - // Convert str as if an integer, then restore the fraction part by dividing the - // result by its base raised to a power. - y.c = toBaseOut( toFixedPoint( coeffToString( x.c ), x.e ), 10, baseOut ); - y.e = y.c.length; - } - - // Convert the number as integer. - xc = toBaseOut( str, baseIn, baseOut ); - e = k = xc.length; - - // Remove trailing zeros. - for ( ; xc[--k] == 0; xc.pop() ); - if ( !xc[0] ) return '0'; - - if ( i < 0 ) { - --e; - } else { - x.c = xc; - x.e = e; - - // sign is needed for correct rounding. - x.s = sign; - x = div( x, y, dp, rm, baseOut ); - xc = x.c; - r = x.r; - e = x.e; - } - - d = e + dp + 1; - - // The rounding digit, i.e. the digit to the right of the digit that may be rounded up. - i = xc[d]; - k = baseOut / 2; - r = r || d < 0 || xc[d + 1] != null; - - r = rm < 4 ? ( i != null || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) ) - : i > k || i == k &&( rm == 4 || r || rm == 6 && xc[d - 1] & 1 || - rm == ( x.s < 0 ? 8 : 7 ) ); - - if ( d < 1 || !xc[0] ) { - - // 1^-dp or 0. - str = r ? toFixedPoint( '1', -dp ) : '0'; - } else { - xc.length = d; - - if (r) { - - // Rounding up may mean the previous digit has to be rounded up and so on. - for ( --baseOut; ++xc[--d] > baseOut; ) { - xc[d] = 0; - - if ( !d ) { - ++e; - xc = [1].concat(xc); - } - } - } - - // Determine trailing zeros. - for ( k = xc.length; !xc[--k]; ); - - // E.g. [4, 11, 15] becomes 4bf. - for ( i = 0, str = ''; i <= k; str += ALPHABET.charAt( xc[i++] ) ); - str = toFixedPoint( str, e ); - } - - // The caller will add the sign. - return str; - } - - - // Perform division in the specified base. Called by div and convertBase. - div = (function () { - - // Assume non-zero x and k. - function multiply( x, k, base ) { - var m, temp, xlo, xhi, - carry = 0, - i = x.length, - klo = k % SQRT_BASE, - khi = k / SQRT_BASE | 0; - - for ( x = x.slice(); i--; ) { - xlo = x[i] % SQRT_BASE; - xhi = x[i] / SQRT_BASE | 0; - m = khi * xlo + xhi * klo; - temp = klo * xlo + ( ( m % SQRT_BASE ) * SQRT_BASE ) + carry; - carry = ( temp / base | 0 ) + ( m / SQRT_BASE | 0 ) + khi * xhi; - x[i] = temp % base; - } - - if (carry) x = [carry].concat(x); - - return x; - } - - function compare( a, b, aL, bL ) { - var i, cmp; - - if ( aL != bL ) { - cmp = aL > bL ? 1 : -1; - } else { - - for ( i = cmp = 0; i < aL; i++ ) { - - if ( a[i] != b[i] ) { - cmp = a[i] > b[i] ? 1 : -1; - break; - } - } - } - return cmp; - } - - function subtract( a, b, aL, base ) { - var i = 0; - - // Subtract b from a. - for ( ; aL--; ) { - a[aL] -= i; - i = a[aL] < b[aL] ? 1 : 0; - a[aL] = i * base + a[aL] - b[aL]; - } - - // Remove leading zeros. - for ( ; !a[0] && a.length > 1; a.splice(0, 1) ); - } - - // x: dividend, y: divisor. - return function ( x, y, dp, rm, base ) { - var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0, - yL, yz, - s = x.s == y.s ? 1 : -1, - xc = x.c, - yc = y.c; - - // Either NaN, Infinity or 0? - if ( !xc || !xc[0] || !yc || !yc[0] ) { - - return new BigNumber( - - // Return NaN if either NaN, or both Infinity or 0. - !x.s || !y.s || ( xc ? yc && xc[0] == yc[0] : !yc ) ? NaN : - - // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0. - xc && xc[0] == 0 || !yc ? s * 0 : s / 0 - ); - } - - q = new BigNumber(s); - qc = q.c = []; - e = x.e - y.e; - s = dp + e + 1; - - if ( !base ) { - base = BASE; - e = bitFloor( x.e / LOG_BASE ) - bitFloor( y.e / LOG_BASE ); - s = s / LOG_BASE | 0; - } - - // Result exponent may be one less then the current value of e. - // The coefficients of the BigNumbers from convertBase may have trailing zeros. - for ( i = 0; yc[i] == ( xc[i] || 0 ); i++ ); - if ( yc[i] > ( xc[i] || 0 ) ) e--; - - if ( s < 0 ) { - qc.push(1); - more = true; - } else { - xL = xc.length; - yL = yc.length; - i = 0; - s += 2; - - // Normalise xc and yc so highest order digit of yc is >= base / 2. - - n = mathfloor( base / ( yc[0] + 1 ) ); - - // Not necessary, but to handle odd bases where yc[0] == ( base / 2 ) - 1. - // if ( n > 1 || n++ == 1 && yc[0] < base / 2 ) { - if ( n > 1 ) { - yc = multiply( yc, n, base ); - xc = multiply( xc, n, base ); - yL = yc.length; - xL = xc.length; - } - - xi = yL; - rem = xc.slice( 0, yL ); - remL = rem.length; - - // Add zeros to make remainder as long as divisor. - for ( ; remL < yL; rem[remL++] = 0 ); - yz = yc.slice(); - yz = [0].concat(yz); - yc0 = yc[0]; - if ( yc[1] >= base / 2 ) yc0++; - // Not necessary, but to prevent trial digit n > base, when using base 3. - // else if ( base == 3 && yc0 == 1 ) yc0 = 1 + 1e-15; - - do { - n = 0; - - // Compare divisor and remainder. - cmp = compare( yc, rem, yL, remL ); - - // If divisor < remainder. - if ( cmp < 0 ) { - - // Calculate trial digit, n. - - rem0 = rem[0]; - if ( yL != remL ) rem0 = rem0 * base + ( rem[1] || 0 ); - - // n is how many times the divisor goes into the current remainder. - n = mathfloor( rem0 / yc0 ); - - // Algorithm: - // 1. product = divisor * trial digit (n) - // 2. if product > remainder: product -= divisor, n-- - // 3. remainder -= product - // 4. if product was < remainder at 2: - // 5. compare new remainder and divisor - // 6. If remainder > divisor: remainder -= divisor, n++ - - if ( n > 1 ) { - - // n may be > base only when base is 3. - if (n >= base) n = base - 1; - - // product = divisor * trial digit. - prod = multiply( yc, n, base ); - prodL = prod.length; - remL = rem.length; - - // Compare product and remainder. - // If product > remainder. - // Trial digit n too high. - // n is 1 too high about 5% of the time, and is not known to have - // ever been more than 1 too high. - while ( compare( prod, rem, prodL, remL ) == 1 ) { - n--; - - // Subtract divisor from product. - subtract( prod, yL < prodL ? yz : yc, prodL, base ); - prodL = prod.length; - cmp = 1; - } - } else { - - // n is 0 or 1, cmp is -1. - // If n is 0, there is no need to compare yc and rem again below, - // so change cmp to 1 to avoid it. - // If n is 1, leave cmp as -1, so yc and rem are compared again. - if ( n == 0 ) { - - // divisor < remainder, so n must be at least 1. - cmp = n = 1; - } - - // product = divisor - prod = yc.slice(); - prodL = prod.length; - } - - if ( prodL < remL ) prod = [0].concat(prod); - - // Subtract product from remainder. - subtract( rem, prod, remL, base ); - remL = rem.length; - - // If product was < remainder. - if ( cmp == -1 ) { - - // Compare divisor and new remainder. - // If divisor < new remainder, subtract divisor from remainder. - // Trial digit n too low. - // n is 1 too low about 5% of the time, and very rarely 2 too low. - while ( compare( yc, rem, yL, remL ) < 1 ) { - n++; - - // Subtract divisor from remainder. - subtract( rem, yL < remL ? yz : yc, remL, base ); - remL = rem.length; - } - } - } else if ( cmp === 0 ) { - n++; - rem = [0]; - } // else cmp === 1 and n will be 0 - - // Add the next digit, n, to the result array. - qc[i++] = n; - - // Update the remainder. - if ( rem[0] ) { - rem[remL++] = xc[xi] || 0; - } else { - rem = [ xc[xi] ]; - remL = 1; - } - } while ( ( xi++ < xL || rem[0] != null ) && s-- ); - - more = rem[0] != null; - - // Leading zero? - if ( !qc[0] ) qc.splice(0, 1); - } - - if ( base == BASE ) { - - // To calculate q.e, first get the number of digits of qc[0]. - for ( i = 1, s = qc[0]; s >= 10; s /= 10, i++ ); - round( q, dp + ( q.e = i + e * LOG_BASE - 1 ) + 1, rm, more ); - - // Caller is convertBase. - } else { - q.e = e; - q.r = +more; - } - - return q; - }; - })(); - - - /* - * Return a string representing the value of BigNumber n in fixed-point or exponential - * notation rounded to the specified decimal places or significant digits. - * - * n is a BigNumber. - * i is the index of the last digit required (i.e. the digit that may be rounded up). - * rm is the rounding mode. - * caller is caller id: toExponential 19, toFixed 20, toFormat 21, toPrecision 24. - */ - function format( n, i, rm, caller ) { - var c0, e, ne, len, str; - - rm = rm != null && isValidInt( rm, 0, 8, caller, roundingMode ) - ? rm | 0 : ROUNDING_MODE; - - if ( !n.c ) return n.toString(); - c0 = n.c[0]; - ne = n.e; - - if ( i == null ) { - str = coeffToString( n.c ); - str = caller == 19 || caller == 24 && ne <= TO_EXP_NEG - ? toExponential( str, ne ) - : toFixedPoint( str, ne ); - } else { - n = round( new BigNumber(n), i, rm ); - - // n.e may have changed if the value was rounded up. - e = n.e; - - str = coeffToString( n.c ); - len = str.length; - - // toPrecision returns exponential notation if the number of significant digits - // specified is less than the number of digits necessary to represent the integer - // part of the value in fixed-point notation. - - // Exponential notation. - if ( caller == 19 || caller == 24 && ( i <= e || e <= TO_EXP_NEG ) ) { - - // Append zeros? - for ( ; len < i; str += '0', len++ ); - str = toExponential( str, e ); - - // Fixed-point notation. - } else { - i -= ne; - str = toFixedPoint( str, e ); - - // Append zeros? - if ( e + 1 > len ) { - if ( --i > 0 ) for ( str += '.'; i--; str += '0' ); - } else { - i += e - len; - if ( i > 0 ) { - if ( e + 1 == len ) str += '.'; - for ( ; i--; str += '0' ); - } - } - } - } - - return n.s < 0 && c0 ? '-' + str : str; - } - - - // Handle BigNumber.max and BigNumber.min. - function maxOrMin( args, method ) { - var m, n, - i = 0; - - if ( isArray( args[0] ) ) args = args[0]; - m = new BigNumber( args[0] ); - - for ( ; ++i < args.length; ) { - n = new BigNumber( args[i] ); - - // If any number is NaN, return NaN. - if ( !n.s ) { - m = n; - break; - } else if ( method.call( m, n ) ) { - m = n; - } - } - - return m; - } - - - /* - * Return true if n is an integer in range, otherwise throw. - * Use for argument validation when ERRORS is true. - */ - function intValidatorWithErrors( n, min, max, caller, name ) { - if ( n < min || n > max || n != truncate(n) ) { - raise( caller, ( name || 'decimal places' ) + - ( n < min || n > max ? ' out of range' : ' not an integer' ), n ); - } - - return true; - } - - - /* - * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP. - * Called by minus, plus and times. - */ - function normalise( n, c, e ) { - var i = 1, - j = c.length; - - // Remove trailing zeros. - for ( ; !c[--j]; c.pop() ); - - // Calculate the base 10 exponent. First get the number of digits of c[0]. - for ( j = c[0]; j >= 10; j /= 10, i++ ); - - // Overflow? - if ( ( e = i + e * LOG_BASE - 1 ) > MAX_EXP ) { - - // Infinity. - n.c = n.e = null; - - // Underflow? - } else if ( e < MIN_EXP ) { - - // Zero. - n.c = [ n.e = 0 ]; - } else { - n.e = e; - n.c = c; - } - - return n; - } - - - // Handle values that fail the validity test in BigNumber. - parseNumeric = (function () { - var basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i, - dotAfter = /^([^.]+)\.$/, - dotBefore = /^\.([^.]+)$/, - isInfinityOrNaN = /^-?(Infinity|NaN)$/, - whitespaceOrPlus = /^\s*\+(?=[\w.])|^\s+|\s+$/g; - - return function ( x, str, num, b ) { - var base, - s = num ? str : str.replace( whitespaceOrPlus, '' ); - - // No exception on ±Infinity or NaN. - if ( isInfinityOrNaN.test(s) ) { - x.s = isNaN(s) ? null : s < 0 ? -1 : 1; - } else { - if ( !num ) { - - // basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i - s = s.replace( basePrefix, function ( m, p1, p2 ) { - base = ( p2 = p2.toLowerCase() ) == 'x' ? 16 : p2 == 'b' ? 2 : 8; - return !b || b == base ? p1 : m; - }); - - if (b) { - base = b; - - // E.g. '1.' to '1', '.1' to '0.1' - s = s.replace( dotAfter, '$1' ).replace( dotBefore, '0.$1' ); - } - - if ( str != s ) return new BigNumber( s, base ); - } - - // 'new BigNumber() not a number: {n}' - // 'new BigNumber() not a base {b} number: {n}' - if (ERRORS) raise( id, 'not a' + ( b ? ' base ' + b : '' ) + ' number', str ); - x.s = null; - } - - x.c = x.e = null; - id = 0; - } - })(); - - - // Throw a BigNumber Error. - function raise( caller, msg, val ) { - var error = new Error( [ - 'new BigNumber', // 0 - 'cmp', // 1 - 'config', // 2 - 'div', // 3 - 'divToInt', // 4 - 'eq', // 5 - 'gt', // 6 - 'gte', // 7 - 'lt', // 8 - 'lte', // 9 - 'minus', // 10 - 'mod', // 11 - 'plus', // 12 - 'precision', // 13 - 'random', // 14 - 'round', // 15 - 'shift', // 16 - 'times', // 17 - 'toDigits', // 18 - 'toExponential', // 19 - 'toFixed', // 20 - 'toFormat', // 21 - 'toFraction', // 22 - 'pow', // 23 - 'toPrecision', // 24 - 'toString', // 25 - 'BigNumber' // 26 - ][caller] + '() ' + msg + ': ' + val ); - - error.name = 'BigNumber Error'; - id = 0; - throw error; - } - - - /* - * Round x to sd significant digits using rounding mode rm. Check for over/under-flow. - * If r is truthy, it is known that there are more digits after the rounding digit. - */ - function round( x, sd, rm, r ) { - var d, i, j, k, n, ni, rd, - xc = x.c, - pows10 = POWS_TEN; - - // if x is not Infinity or NaN... - if (xc) { - - // rd is the rounding digit, i.e. the digit after the digit that may be rounded up. - // n is a base 1e14 number, the value of the element of array x.c containing rd. - // ni is the index of n within x.c. - // d is the number of digits of n. - // i is the index of rd within n including leading zeros. - // j is the actual index of rd within n (if < 0, rd is a leading zero). - out: { - - // Get the number of digits of the first element of xc. - for ( d = 1, k = xc[0]; k >= 10; k /= 10, d++ ); - i = sd - d; - - // If the rounding digit is in the first element of xc... - if ( i < 0 ) { - i += LOG_BASE; - j = sd; - n = xc[ ni = 0 ]; - - // Get the rounding digit at index j of n. - rd = n / pows10[ d - j - 1 ] % 10 | 0; - } else { - ni = mathceil( ( i + 1 ) / LOG_BASE ); - - if ( ni >= xc.length ) { - - if (r) { - - // Needed by sqrt. - for ( ; xc.length <= ni; xc.push(0) ); - n = rd = 0; - d = 1; - i %= LOG_BASE; - j = i - LOG_BASE + 1; - } else { - break out; - } - } else { - n = k = xc[ni]; - - // Get the number of digits of n. - for ( d = 1; k >= 10; k /= 10, d++ ); - - // Get the index of rd within n. - i %= LOG_BASE; - - // Get the index of rd within n, adjusted for leading zeros. - // The number of leading zeros of n is given by LOG_BASE - d. - j = i - LOG_BASE + d; - - // Get the rounding digit at index j of n. - rd = j < 0 ? 0 : n / pows10[ d - j - 1 ] % 10 | 0; - } - } - - r = r || sd < 0 || - - // Are there any non-zero digits after the rounding digit? - // The expression n % pows10[ d - j - 1 ] returns all digits of n to the right - // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714. - xc[ni + 1] != null || ( j < 0 ? n : n % pows10[ d - j - 1 ] ); - - r = rm < 4 - ? ( rd || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) ) - : rd > 5 || rd == 5 && ( rm == 4 || r || rm == 6 && - - // Check whether the digit to the left of the rounding digit is odd. - ( ( i > 0 ? j > 0 ? n / pows10[ d - j ] : 0 : xc[ni - 1] ) % 10 ) & 1 || - rm == ( x.s < 0 ? 8 : 7 ) ); - - if ( sd < 1 || !xc[0] ) { - xc.length = 0; - - if (r) { - - // Convert sd to decimal places. - sd -= x.e + 1; - - // 1, 0.1, 0.01, 0.001, 0.0001 etc. - xc[0] = pows10[ ( LOG_BASE - sd % LOG_BASE ) % LOG_BASE ]; - x.e = -sd || 0; - } else { - - // Zero. - xc[0] = x.e = 0; - } - - return x; - } - - // Remove excess digits. - if ( i == 0 ) { - xc.length = ni; - k = 1; - ni--; - } else { - xc.length = ni + 1; - k = pows10[ LOG_BASE - i ]; - - // E.g. 56700 becomes 56000 if 7 is the rounding digit. - // j > 0 means i > number of leading zeros of n. - xc[ni] = j > 0 ? mathfloor( n / pows10[ d - j ] % pows10[j] ) * k : 0; - } - - // Round up? - if (r) { - - for ( ; ; ) { - - // If the digit to be rounded up is in the first element of xc... - if ( ni == 0 ) { - - // i will be the length of xc[0] before k is added. - for ( i = 1, j = xc[0]; j >= 10; j /= 10, i++ ); - j = xc[0] += k; - for ( k = 1; j >= 10; j /= 10, k++ ); - - // if i != k the length has increased. - if ( i != k ) { - x.e++; - if ( xc[0] == BASE ) xc[0] = 1; - } - - break; - } else { - xc[ni] += k; - if ( xc[ni] != BASE ) break; - xc[ni--] = 0; - k = 1; - } - } - } - - // Remove trailing zeros. - for ( i = xc.length; xc[--i] === 0; xc.pop() ); - } - - // Overflow? Infinity. - if ( x.e > MAX_EXP ) { - x.c = x.e = null; - - // Underflow? Zero. - } else if ( x.e < MIN_EXP ) { - x.c = [ x.e = 0 ]; - } - } - - return x; - } - - - // PROTOTYPE/INSTANCE METHODS - - - /* - * Return a new BigNumber whose value is the absolute value of this BigNumber. - */ - P.absoluteValue = P.abs = function () { - var x = new BigNumber(this); - if ( x.s < 0 ) x.s = 1; - return x; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole - * number in the direction of Infinity. - */ - P.ceil = function () { - return round( new BigNumber(this), this.e + 1, 2 ); - }; - - - /* - * Return - * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b), - * -1 if the value of this BigNumber is less than the value of BigNumber(y, b), - * 0 if they have the same value, - * or null if the value of either is NaN. - */ - P.comparedTo = P.cmp = function ( y, b ) { - id = 1; - return compare( this, new BigNumber( y, b ) ); - }; - - - /* - * Return the number of decimal places of the value of this BigNumber, or null if the value - * of this BigNumber is ±Infinity or NaN. - */ - P.decimalPlaces = P.dp = function () { - var n, v, - c = this.c; - - if ( !c ) return null; - n = ( ( v = c.length - 1 ) - bitFloor( this.e / LOG_BASE ) ) * LOG_BASE; - - // Subtract the number of trailing zeros of the last number. - if ( v = c[v] ) for ( ; v % 10 == 0; v /= 10, n-- ); - if ( n < 0 ) n = 0; - - return n; - }; - - - /* - * n / 0 = I - * n / N = N - * n / I = 0 - * 0 / n = 0 - * 0 / 0 = N - * 0 / N = N - * 0 / I = 0 - * N / n = N - * N / 0 = N - * N / N = N - * N / I = N - * I / n = I - * I / 0 = I - * I / N = N - * I / I = N - * - * Return a new BigNumber whose value is the value of this BigNumber divided by the value of - * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE. - */ - P.dividedBy = P.div = function ( y, b ) { - id = 3; - return div( this, new BigNumber( y, b ), DECIMAL_PLACES, ROUNDING_MODE ); - }; - - - /* - * Return a new BigNumber whose value is the integer part of dividing the value of this - * BigNumber by the value of BigNumber(y, b). - */ - P.dividedToIntegerBy = P.divToInt = function ( y, b ) { - id = 4; - return div( this, new BigNumber( y, b ), 0, 1 ); - }; - - - /* - * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b), - * otherwise returns false. - */ - P.equals = P.eq = function ( y, b ) { - id = 5; - return compare( this, new BigNumber( y, b ) ) === 0; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole - * number in the direction of -Infinity. - */ - P.floor = function () { - return round( new BigNumber(this), this.e + 1, 3 ); - }; - - - /* - * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b), - * otherwise returns false. - */ - P.greaterThan = P.gt = function ( y, b ) { - id = 6; - return compare( this, new BigNumber( y, b ) ) > 0; - }; - - - /* - * Return true if the value of this BigNumber is greater than or equal to the value of - * BigNumber(y, b), otherwise returns false. - */ - P.greaterThanOrEqualTo = P.gte = function ( y, b ) { - id = 7; - return ( b = compare( this, new BigNumber( y, b ) ) ) === 1 || b === 0; - - }; - - - /* - * Return true if the value of this BigNumber is a finite number, otherwise returns false. - */ - P.isFinite = function () { - return !!this.c; - }; - - - /* - * Return true if the value of this BigNumber is an integer, otherwise return false. - */ - P.isInteger = P.isInt = function () { - return !!this.c && bitFloor( this.e / LOG_BASE ) > this.c.length - 2; - }; - - - /* - * Return true if the value of this BigNumber is NaN, otherwise returns false. - */ - P.isNaN = function () { - return !this.s; - }; - - - /* - * Return true if the value of this BigNumber is negative, otherwise returns false. - */ - P.isNegative = P.isNeg = function () { - return this.s < 0; - }; - - - /* - * Return true if the value of this BigNumber is 0 or -0, otherwise returns false. - */ - P.isZero = function () { - return !!this.c && this.c[0] == 0; - }; - - - /* - * Return true if the value of this BigNumber is less than the value of BigNumber(y, b), - * otherwise returns false. - */ - P.lessThan = P.lt = function ( y, b ) { - id = 8; - return compare( this, new BigNumber( y, b ) ) < 0; - }; - - - /* - * Return true if the value of this BigNumber is less than or equal to the value of - * BigNumber(y, b), otherwise returns false. - */ - P.lessThanOrEqualTo = P.lte = function ( y, b ) { - id = 9; - return ( b = compare( this, new BigNumber( y, b ) ) ) === -1 || b === 0; - }; - - - /* - * n - 0 = n - * n - N = N - * n - I = -I - * 0 - n = -n - * 0 - 0 = 0 - * 0 - N = N - * 0 - I = -I - * N - n = N - * N - 0 = N - * N - N = N - * N - I = N - * I - n = I - * I - 0 = I - * I - N = N - * I - I = N - * - * Return a new BigNumber whose value is the value of this BigNumber minus the value of - * BigNumber(y, b). - */ - P.minus = P.sub = function ( y, b ) { - var i, j, t, xLTy, - x = this, - a = x.s; - - id = 10; - y = new BigNumber( y, b ); - b = y.s; - - // Either NaN? - if ( !a || !b ) return new BigNumber(NaN); - - // Signs differ? - if ( a != b ) { - y.s = -b; - return x.plus(y); - } - - var xe = x.e / LOG_BASE, - ye = y.e / LOG_BASE, - xc = x.c, - yc = y.c; - - if ( !xe || !ye ) { - - // Either Infinity? - if ( !xc || !yc ) return xc ? ( y.s = -b, y ) : new BigNumber( yc ? x : NaN ); - - // Either zero? - if ( !xc[0] || !yc[0] ) { - - // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. - return yc[0] ? ( y.s = -b, y ) : new BigNumber( xc[0] ? x : - - // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity - ROUNDING_MODE == 3 ? -0 : 0 ); - } - } - - xe = bitFloor(xe); - ye = bitFloor(ye); - xc = xc.slice(); - - // Determine which is the bigger number. - if ( a = xe - ye ) { - - if ( xLTy = a < 0 ) { - a = -a; - t = xc; - } else { - ye = xe; - t = yc; - } - - t.reverse(); - - // Prepend zeros to equalise exponents. - for ( b = a; b--; t.push(0) ); - t.reverse(); - } else { - - // Exponents equal. Check digit by digit. - j = ( xLTy = ( a = xc.length ) < ( b = yc.length ) ) ? a : b; - - for ( a = b = 0; b < j; b++ ) { - - if ( xc[b] != yc[b] ) { - xLTy = xc[b] < yc[b]; - break; - } - } - } - - // x < y? Point xc to the array of the bigger number. - if (xLTy) t = xc, xc = yc, yc = t, y.s = -y.s; - - b = ( j = yc.length ) - ( i = xc.length ); - - // Append zeros to xc if shorter. - // No need to add zeros to yc if shorter as subtract only needs to start at yc.length. - if ( b > 0 ) for ( ; b--; xc[i++] = 0 ); - b = BASE - 1; - - // Subtract yc from xc. - for ( ; j > a; ) { - - if ( xc[--j] < yc[j] ) { - for ( i = j; i && !xc[--i]; xc[i] = b ); - --xc[i]; - xc[j] += BASE; - } - - xc[j] -= yc[j]; - } - - // Remove leading zeros and adjust exponent accordingly. - for ( ; xc[0] == 0; xc.splice(0, 1), --ye ); - - // Zero? - if ( !xc[0] ) { - - // Following IEEE 754 (2008) 6.3, - // n - n = +0 but n - n = -0 when rounding towards -Infinity. - y.s = ROUNDING_MODE == 3 ? -1 : 1; - y.c = [ y.e = 0 ]; - return y; - } - - // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity - // for finite x and y. - return normalise( y, xc, ye ); - }; - - - /* - * n % 0 = N - * n % N = N - * n % I = n - * 0 % n = 0 - * -0 % n = -0 - * 0 % 0 = N - * 0 % N = N - * 0 % I = 0 - * N % n = N - * N % 0 = N - * N % N = N - * N % I = N - * I % n = N - * I % 0 = N - * I % N = N - * I % I = N - * - * Return a new BigNumber whose value is the value of this BigNumber modulo the value of - * BigNumber(y, b). The result depends on the value of MODULO_MODE. - */ - P.modulo = P.mod = function ( y, b ) { - var q, s, - x = this; - - id = 11; - y = new BigNumber( y, b ); - - // Return NaN if x is Infinity or NaN, or y is NaN or zero. - if ( !x.c || !y.s || y.c && !y.c[0] ) { - return new BigNumber(NaN); - - // Return x if y is Infinity or x is zero. - } else if ( !y.c || x.c && !x.c[0] ) { - return new BigNumber(x); - } - - if ( MODULO_MODE == 9 ) { - - // Euclidian division: q = sign(y) * floor(x / abs(y)) - // r = x - qy where 0 <= r < abs(y) - s = y.s; - y.s = 1; - q = div( x, y, 0, 3 ); - y.s = s; - q.s *= s; - } else { - q = div( x, y, 0, MODULO_MODE ); - } - - return x.minus( q.times(y) ); - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber negated, - * i.e. multiplied by -1. - */ - P.negated = P.neg = function () { - var x = new BigNumber(this); - x.s = -x.s || null; - return x; - }; - - - /* - * n + 0 = n - * n + N = N - * n + I = I - * 0 + n = n - * 0 + 0 = 0 - * 0 + N = N - * 0 + I = I - * N + n = N - * N + 0 = N - * N + N = N - * N + I = N - * I + n = I - * I + 0 = I - * I + N = N - * I + I = I - * - * Return a new BigNumber whose value is the value of this BigNumber plus the value of - * BigNumber(y, b). - */ - P.plus = P.add = function ( y, b ) { - var t, - x = this, - a = x.s; - - id = 12; - y = new BigNumber( y, b ); - b = y.s; - - // Either NaN? - if ( !a || !b ) return new BigNumber(NaN); - - // Signs differ? - if ( a != b ) { - y.s = -b; - return x.minus(y); - } - - var xe = x.e / LOG_BASE, - ye = y.e / LOG_BASE, - xc = x.c, - yc = y.c; - - if ( !xe || !ye ) { - - // Return ±Infinity if either ±Infinity. - if ( !xc || !yc ) return new BigNumber( a / 0 ); - - // Either zero? - // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. - if ( !xc[0] || !yc[0] ) return yc[0] ? y : new BigNumber( xc[0] ? x : a * 0 ); - } - - xe = bitFloor(xe); - ye = bitFloor(ye); - xc = xc.slice(); - - // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts. - if ( a = xe - ye ) { - if ( a > 0 ) { - ye = xe; - t = yc; - } else { - a = -a; - t = xc; - } - - t.reverse(); - for ( ; a--; t.push(0) ); - t.reverse(); - } - - a = xc.length; - b = yc.length; - - // Point xc to the longer array, and b to the shorter length. - if ( a - b < 0 ) t = yc, yc = xc, xc = t, b = a; - - // Only start adding at yc.length - 1 as the further digits of xc can be ignored. - for ( a = 0; b; ) { - a = ( xc[--b] = xc[b] + yc[b] + a ) / BASE | 0; - xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE; - } - - if (a) { - xc = [a].concat(xc); - ++ye; - } - - // No need to check for zero, as +x + +y != 0 && -x + -y != 0 - // ye = MAX_EXP + 1 possible - return normalise( y, xc, ye ); - }; - - - /* - * Return the number of significant digits of the value of this BigNumber. - * - * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0. - */ - P.precision = P.sd = function (z) { - var n, v, - x = this, - c = x.c; - - // 'precision() argument not a boolean or binary digit: {z}' - if ( z != null && z !== !!z && z !== 1 && z !== 0 ) { - if (ERRORS) raise( 13, 'argument' + notBool, z ); - if ( z != !!z ) z = null; - } - - if ( !c ) return null; - v = c.length - 1; - n = v * LOG_BASE + 1; - - if ( v = c[v] ) { - - // Subtract the number of trailing zeros of the last element. - for ( ; v % 10 == 0; v /= 10, n-- ); - - // Add the number of digits of the first element. - for ( v = c[0]; v >= 10; v /= 10, n++ ); - } - - if ( z && x.e + 1 > n ) n = x.e + 1; - - return n; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of - * dp decimal places using rounding mode rm, or to 0 and ROUNDING_MODE respectively if - * omitted. - * - * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'round() decimal places out of range: {dp}' - * 'round() decimal places not an integer: {dp}' - * 'round() rounding mode not an integer: {rm}' - * 'round() rounding mode out of range: {rm}' - */ - P.round = function ( dp, rm ) { - var n = new BigNumber(this); - - if ( dp == null || isValidInt( dp, 0, MAX, 15 ) ) { - round( n, ~~dp + this.e + 1, rm == null || - !isValidInt( rm, 0, 8, 15, roundingMode ) ? ROUNDING_MODE : rm | 0 ); - } - - return n; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber shifted by k places - * (powers of 10). Shift to the right if n > 0, and to the left if n < 0. - * - * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive. - * - * If k is out of range and ERRORS is false, the result will be ±0 if k < 0, or ±Infinity - * otherwise. - * - * 'shift() argument not an integer: {k}' - * 'shift() argument out of range: {k}' - */ - P.shift = function (k) { - var n = this; - return isValidInt( k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 16, 'argument' ) - - // k < 1e+21, or truncate(k) will produce exponential notation. - ? n.times( '1e' + truncate(k) ) - : new BigNumber( n.c && n.c[0] && ( k < -MAX_SAFE_INTEGER || k > MAX_SAFE_INTEGER ) - ? n.s * ( k < 0 ? 0 : 1 / 0 ) - : n ); - }; - - - /* - * sqrt(-n) = N - * sqrt( N) = N - * sqrt(-I) = N - * sqrt( I) = I - * sqrt( 0) = 0 - * sqrt(-0) = -0 - * - * Return a new BigNumber whose value is the square root of the value of this BigNumber, - * rounded according to DECIMAL_PLACES and ROUNDING_MODE. - */ - P.squareRoot = P.sqrt = function () { - var m, n, r, rep, t, - x = this, - c = x.c, - s = x.s, - e = x.e, - dp = DECIMAL_PLACES + 4, - half = new BigNumber('0.5'); - - // Negative/NaN/Infinity/zero? - if ( s !== 1 || !c || !c[0] ) { - return new BigNumber( !s || s < 0 && ( !c || c[0] ) ? NaN : c ? x : 1 / 0 ); - } - - // Initial estimate. - s = Math.sqrt( +x ); - - // Math.sqrt underflow/overflow? - // Pass x to Math.sqrt as integer, then adjust the exponent of the result. - if ( s == 0 || s == 1 / 0 ) { - n = coeffToString(c); - if ( ( n.length + e ) % 2 == 0 ) n += '0'; - s = Math.sqrt(n); - e = bitFloor( ( e + 1 ) / 2 ) - ( e < 0 || e % 2 ); - - if ( s == 1 / 0 ) { - n = '1e' + e; - } else { - n = s.toExponential(); - n = n.slice( 0, n.indexOf('e') + 1 ) + e; - } - - r = new BigNumber(n); - } else { - r = new BigNumber( s + '' ); - } - - // Check for zero. - // r could be zero if MIN_EXP is changed after the this value was created. - // This would cause a division by zero (x/t) and hence Infinity below, which would cause - // coeffToString to throw. - if ( r.c[0] ) { - e = r.e; - s = e + dp; - if ( s < 3 ) s = 0; - - // Newton-Raphson iteration. - for ( ; ; ) { - t = r; - r = half.times( t.plus( div( x, t, dp, 1 ) ) ); - - if ( coeffToString( t.c ).slice( 0, s ) === ( n = - coeffToString( r.c ) ).slice( 0, s ) ) { - - // The exponent of r may here be one less than the final result exponent, - // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits - // are indexed correctly. - if ( r.e < e ) --s; - n = n.slice( s - 3, s + 1 ); - - // The 4th rounding digit may be in error by -1 so if the 4 rounding digits - // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the - // iteration. - if ( n == '9999' || !rep && n == '4999' ) { - - // On the first iteration only, check to see if rounding up gives the - // exact result as the nines may infinitely repeat. - if ( !rep ) { - round( t, t.e + DECIMAL_PLACES + 2, 0 ); - - if ( t.times(t).eq(x) ) { - r = t; - break; - } - } - - dp += 4; - s += 4; - rep = 1; - } else { - - // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact - // result. If not, then there are further digits and m will be truthy. - if ( !+n || !+n.slice(1) && n.charAt(0) == '5' ) { - - // Truncate to the first rounding digit. - round( r, r.e + DECIMAL_PLACES + 2, 1 ); - m = !r.times(r).eq(x); - } - - break; - } - } - } - } - - return round( r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m ); - }; - - - /* - * n * 0 = 0 - * n * N = N - * n * I = I - * 0 * n = 0 - * 0 * 0 = 0 - * 0 * N = N - * 0 * I = N - * N * n = N - * N * 0 = N - * N * N = N - * N * I = N - * I * n = I - * I * 0 = N - * I * N = N - * I * I = I - * - * Return a new BigNumber whose value is the value of this BigNumber times the value of - * BigNumber(y, b). - */ - P.times = P.mul = function ( y, b ) { - var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc, - base, sqrtBase, - x = this, - xc = x.c, - yc = ( id = 17, y = new BigNumber( y, b ) ).c; - - // Either NaN, ±Infinity or ±0? - if ( !xc || !yc || !xc[0] || !yc[0] ) { - - // Return NaN if either is NaN, or one is 0 and the other is Infinity. - if ( !x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc ) { - y.c = y.e = y.s = null; - } else { - y.s *= x.s; - - // Return ±Infinity if either is ±Infinity. - if ( !xc || !yc ) { - y.c = y.e = null; - - // Return ±0 if either is ±0. - } else { - y.c = [0]; - y.e = 0; - } - } - - return y; - } - - e = bitFloor( x.e / LOG_BASE ) + bitFloor( y.e / LOG_BASE ); - y.s *= x.s; - xcL = xc.length; - ycL = yc.length; - - // Ensure xc points to longer array and xcL to its length. - if ( xcL < ycL ) zc = xc, xc = yc, yc = zc, i = xcL, xcL = ycL, ycL = i; - - // Initialise the result array with zeros. - for ( i = xcL + ycL, zc = []; i--; zc.push(0) ); - - base = BASE; - sqrtBase = SQRT_BASE; - - for ( i = ycL; --i >= 0; ) { - c = 0; - ylo = yc[i] % sqrtBase; - yhi = yc[i] / sqrtBase | 0; - - for ( k = xcL, j = i + k; j > i; ) { - xlo = xc[--k] % sqrtBase; - xhi = xc[k] / sqrtBase | 0; - m = yhi * xlo + xhi * ylo; - xlo = ylo * xlo + ( ( m % sqrtBase ) * sqrtBase ) + zc[j] + c; - c = ( xlo / base | 0 ) + ( m / sqrtBase | 0 ) + yhi * xhi; - zc[j--] = xlo % base; - } - - zc[j] = c; - } - - if (c) { - ++e; - } else { - zc.splice(0, 1); - } - - return normalise( y, zc, e ); - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of - * sd significant digits using rounding mode rm, or ROUNDING_MODE if rm is omitted. - * - * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'toDigits() precision out of range: {sd}' - * 'toDigits() precision not an integer: {sd}' - * 'toDigits() rounding mode not an integer: {rm}' - * 'toDigits() rounding mode out of range: {rm}' - */ - P.toDigits = function ( sd, rm ) { - var n = new BigNumber(this); - sd = sd == null || !isValidInt( sd, 1, MAX, 18, 'precision' ) ? null : sd | 0; - rm = rm == null || !isValidInt( rm, 0, 8, 18, roundingMode ) ? ROUNDING_MODE : rm | 0; - return sd ? round( n, sd, rm ) : n; - }; - - - /* - * Return a string representing the value of this BigNumber in exponential notation and - * rounded using ROUNDING_MODE to dp fixed decimal places. - * - * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'toExponential() decimal places not an integer: {dp}' - * 'toExponential() decimal places out of range: {dp}' - * 'toExponential() rounding mode not an integer: {rm}' - * 'toExponential() rounding mode out of range: {rm}' - */ - P.toExponential = function ( dp, rm ) { - return format( this, - dp != null && isValidInt( dp, 0, MAX, 19 ) ? ~~dp + 1 : null, rm, 19 ); - }; - - - /* - * Return a string representing the value of this BigNumber in fixed-point notation rounding - * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted. - * - * Note: as with JavaScript's number type, (-0).toFixed(0) is '0', - * but e.g. (-0.00001).toFixed(0) is '-0'. - * - * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'toFixed() decimal places not an integer: {dp}' - * 'toFixed() decimal places out of range: {dp}' - * 'toFixed() rounding mode not an integer: {rm}' - * 'toFixed() rounding mode out of range: {rm}' - */ - P.toFixed = function ( dp, rm ) { - return format( this, dp != null && isValidInt( dp, 0, MAX, 20 ) - ? ~~dp + this.e + 1 : null, rm, 20 ); - }; - - - /* - * Return a string representing the value of this BigNumber in fixed-point notation rounded - * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties - * of the FORMAT object (see BigNumber.config). - * - * FORMAT = { - * decimalSeparator : '.', - * groupSeparator : ',', - * groupSize : 3, - * secondaryGroupSize : 0, - * fractionGroupSeparator : '\xA0', // non-breaking space - * fractionGroupSize : 0 - * }; - * - * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'toFormat() decimal places not an integer: {dp}' - * 'toFormat() decimal places out of range: {dp}' - * 'toFormat() rounding mode not an integer: {rm}' - * 'toFormat() rounding mode out of range: {rm}' - */ - P.toFormat = function ( dp, rm ) { - var str = format( this, dp != null && isValidInt( dp, 0, MAX, 21 ) - ? ~~dp + this.e + 1 : null, rm, 21 ); - - if ( this.c ) { - var i, - arr = str.split('.'), - g1 = +FORMAT.groupSize, - g2 = +FORMAT.secondaryGroupSize, - groupSeparator = FORMAT.groupSeparator, - intPart = arr[0], - fractionPart = arr[1], - isNeg = this.s < 0, - intDigits = isNeg ? intPart.slice(1) : intPart, - len = intDigits.length; - - if (g2) i = g1, g1 = g2, g2 = i, len -= i; - - if ( g1 > 0 && len > 0 ) { - i = len % g1 || g1; - intPart = intDigits.substr( 0, i ); - - for ( ; i < len; i += g1 ) { - intPart += groupSeparator + intDigits.substr( i, g1 ); - } - - if ( g2 > 0 ) intPart += groupSeparator + intDigits.slice(i); - if (isNeg) intPart = '-' + intPart; - } - - str = fractionPart - ? intPart + FORMAT.decimalSeparator + ( ( g2 = +FORMAT.fractionGroupSize ) - ? fractionPart.replace( new RegExp( '\\d{' + g2 + '}\\B', 'g' ), - '$&' + FORMAT.fractionGroupSeparator ) - : fractionPart ) - : intPart; - } - - return str; - }; - - - /* - * Return a string array representing the value of this BigNumber as a simple fraction with - * an integer numerator and an integer denominator. The denominator will be a positive - * non-zero value less than or equal to the specified maximum denominator. If a maximum - * denominator is not specified, the denominator will be the lowest value necessary to - * represent the number exactly. - * - * [md] {number|string|BigNumber} Integer >= 1 and < Infinity. The maximum denominator. - * - * 'toFraction() max denominator not an integer: {md}' - * 'toFraction() max denominator out of range: {md}' - */ - P.toFraction = function (md) { - var arr, d0, d2, e, exp, n, n0, q, s, - k = ERRORS, - x = this, - xc = x.c, - d = new BigNumber(ONE), - n1 = d0 = new BigNumber(ONE), - d1 = n0 = new BigNumber(ONE); - - if ( md != null ) { - ERRORS = false; - n = new BigNumber(md); - ERRORS = k; - - if ( !( k = n.isInt() ) || n.lt(ONE) ) { - - if (ERRORS) { - raise( 22, - 'max denominator ' + ( k ? 'out of range' : 'not an integer' ), md ); - } - - // ERRORS is false: - // If md is a finite non-integer >= 1, round it to an integer and use it. - md = !k && n.c && round( n, n.e + 1, 1 ).gte(ONE) ? n : null; - } - } - - if ( !xc ) return x.toString(); - s = coeffToString(xc); - - // Determine initial denominator. - // d is a power of 10 and the minimum max denominator that specifies the value exactly. - e = d.e = s.length - x.e - 1; - d.c[0] = POWS_TEN[ ( exp = e % LOG_BASE ) < 0 ? LOG_BASE + exp : exp ]; - md = !md || n.cmp(d) > 0 ? ( e > 0 ? d : n1 ) : n; - - exp = MAX_EXP; - MAX_EXP = 1 / 0; - n = new BigNumber(s); - - // n0 = d1 = 0 - n0.c[0] = 0; - - for ( ; ; ) { - q = div( n, d, 0, 1 ); - d2 = d0.plus( q.times(d1) ); - if ( d2.cmp(md) == 1 ) break; - d0 = d1; - d1 = d2; - n1 = n0.plus( q.times( d2 = n1 ) ); - n0 = d2; - d = n.minus( q.times( d2 = d ) ); - n = d2; - } - - d2 = div( md.minus(d0), d1, 0, 1 ); - n0 = n0.plus( d2.times(n1) ); - d0 = d0.plus( d2.times(d1) ); - n0.s = n1.s = x.s; - e *= 2; - - // Determine which fraction is closer to x, n0/d0 or n1/d1 - arr = div( n1, d1, e, ROUNDING_MODE ).minus(x).abs().cmp( - div( n0, d0, e, ROUNDING_MODE ).minus(x).abs() ) < 1 - ? [ n1.toString(), d1.toString() ] - : [ n0.toString(), d0.toString() ]; - - MAX_EXP = exp; - return arr; - }; - - - /* - * Return the value of this BigNumber converted to a number primitive. - */ - P.toNumber = function () { - return +this; - }; - - - /* - * Return a BigNumber whose value is the value of this BigNumber raised to the power n. - * If m is present, return the result modulo m. - * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE. - * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using - * ROUNDING_MODE. - * - * The modular power operation works efficiently when x, n, and m are positive integers, - * otherwise it is equivalent to calculating x.toPower(n).modulo(m) (with POW_PRECISION 0). - * - * n {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive. - * [m] {number|string|BigNumber} The modulus. - * - * 'pow() exponent not an integer: {n}' - * 'pow() exponent out of range: {n}' - * - * Performs 54 loop iterations for n of 9007199254740991. - */ - P.toPower = P.pow = function ( n, m ) { - var k, y, z, - i = mathfloor( n < 0 ? -n : +n ), - x = this; - - if ( m != null ) { - id = 23; - m = new BigNumber(m); - } - - // Pass ±Infinity to Math.pow if exponent is out of range. - if ( !isValidInt( n, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 23, 'exponent' ) && - ( !isFinite(n) || i > MAX_SAFE_INTEGER && ( n /= 0 ) || - parseFloat(n) != n && !( n = NaN ) ) || n == 0 ) { - k = Math.pow( +x, n ); - return new BigNumber( m ? k % m : k ); - } - - if (m) { - if ( n > 1 && x.gt(ONE) && x.isInt() && m.gt(ONE) && m.isInt() ) { - x = x.mod(m); - } else { - z = m; - - // Nullify m so only a single mod operation is performed at the end. - m = null; - } - } else if (POW_PRECISION) { - - // Truncating each coefficient array to a length of k after each multiplication - // equates to truncating significant digits to POW_PRECISION + [28, 41], - // i.e. there will be a minimum of 28 guard digits retained. - // (Using + 1.5 would give [9, 21] guard digits.) - k = mathceil( POW_PRECISION / LOG_BASE + 2 ); - } - - y = new BigNumber(ONE); - - for ( ; ; ) { - if ( i % 2 ) { - y = y.times(x); - if ( !y.c ) break; - if (k) { - if ( y.c.length > k ) y.c.length = k; - } else if (m) { - y = y.mod(m); - } - } - - i = mathfloor( i / 2 ); - if ( !i ) break; - x = x.times(x); - if (k) { - if ( x.c && x.c.length > k ) x.c.length = k; - } else if (m) { - x = x.mod(m); - } - } - - if (m) return y; - if ( n < 0 ) y = ONE.div(y); - - return z ? y.mod(z) : k ? round( y, POW_PRECISION, ROUNDING_MODE ) : y; - }; - - - /* - * Return a string representing the value of this BigNumber rounded to sd significant digits - * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits - * necessary to represent the integer part of the value in fixed-point notation, then use - * exponential notation. - * - * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. - * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. - * - * 'toPrecision() precision not an integer: {sd}' - * 'toPrecision() precision out of range: {sd}' - * 'toPrecision() rounding mode not an integer: {rm}' - * 'toPrecision() rounding mode out of range: {rm}' - */ - P.toPrecision = function ( sd, rm ) { - return format( this, sd != null && isValidInt( sd, 1, MAX, 24, 'precision' ) - ? sd | 0 : null, rm, 24 ); - }; - - - /* - * Return a string representing the value of this BigNumber in base b, or base 10 if b is - * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and - * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent - * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than - * TO_EXP_NEG, return exponential notation. - * - * [b] {number} Integer, 2 to 64 inclusive. - * - * 'toString() base not an integer: {b}' - * 'toString() base out of range: {b}' - */ - P.toString = function (b) { - var str, - n = this, - s = n.s, - e = n.e; - - // Infinity or NaN? - if ( e === null ) { - - if (s) { - str = 'Infinity'; - if ( s < 0 ) str = '-' + str; - } else { - str = 'NaN'; - } - } else { - str = coeffToString( n.c ); - - if ( b == null || !isValidInt( b, 2, 64, 25, 'base' ) ) { - str = e <= TO_EXP_NEG || e >= TO_EXP_POS - ? toExponential( str, e ) - : toFixedPoint( str, e ); - } else { - str = convertBase( toFixedPoint( str, e ), b | 0, 10, s ); - } - - if ( s < 0 && n.c[0] ) str = '-' + str; - } - - return str; - }; - - - /* - * Return a new BigNumber whose value is the value of this BigNumber truncated to a whole - * number. - */ - P.truncated = P.trunc = function () { - return round( new BigNumber(this), this.e + 1, 1 ); - }; - - - /* - * Return as toString, but do not accept a base argument, and include the minus sign for - * negative zero. - */ - P.valueOf = P.toJSON = function () { - var str, - n = this, - e = n.e; - - if ( e === null ) return n.toString(); - - str = coeffToString( n.c ); - - str = e <= TO_EXP_NEG || e >= TO_EXP_POS - ? toExponential( str, e ) - : toFixedPoint( str, e ); - - return n.s < 0 ? '-' + str : str; - }; - - - P.isBigNumber = true; - - if ( config != null ) BigNumber.config(config); - - return BigNumber; - } - - - // PRIVATE HELPER FUNCTIONS - - - function bitFloor(n) { - var i = n | 0; - return n > 0 || n === i ? i : i - 1; - } - - - // Return a coefficient array as a string of base 10 digits. - function coeffToString(a) { - var s, z, - i = 1, - j = a.length, - r = a[0] + ''; - - for ( ; i < j; ) { - s = a[i++] + ''; - z = LOG_BASE - s.length; - for ( ; z--; s = '0' + s ); - r += s; - } - - // Determine trailing zeros. - for ( j = r.length; r.charCodeAt(--j) === 48; ); - return r.slice( 0, j + 1 || 1 ); - } - - - // Compare the value of BigNumbers x and y. - function compare( x, y ) { - var a, b, - xc = x.c, - yc = y.c, - i = x.s, - j = y.s, - k = x.e, - l = y.e; - - // Either NaN? - if ( !i || !j ) return null; - - a = xc && !xc[0]; - b = yc && !yc[0]; - - // Either zero? - if ( a || b ) return a ? b ? 0 : -j : i; - - // Signs differ? - if ( i != j ) return i; - - a = i < 0; - b = k == l; - - // Either Infinity? - if ( !xc || !yc ) return b ? 0 : !xc ^ a ? 1 : -1; - - // Compare exponents. - if ( !b ) return k > l ^ a ? 1 : -1; - - j = ( k = xc.length ) < ( l = yc.length ) ? k : l; - - // Compare digit by digit. - for ( i = 0; i < j; i++ ) if ( xc[i] != yc[i] ) return xc[i] > yc[i] ^ a ? 1 : -1; - - // Compare lengths. - return k == l ? 0 : k > l ^ a ? 1 : -1; - } - - - /* - * Return true if n is a valid number in range, otherwise false. - * Use for argument validation when ERRORS is false. - * Note: parseInt('1e+1') == 1 but parseFloat('1e+1') == 10. - */ - function intValidatorNoErrors( n, min, max ) { - return ( n = truncate(n) ) >= min && n <= max; - } - - - function isArray(obj) { - return Object.prototype.toString.call(obj) == '[object Array]'; - } - - - /* - * Convert string of baseIn to an array of numbers of baseOut. - * Eg. convertBase('255', 10, 16) returns [15, 15]. - * Eg. convertBase('ff', 16, 10) returns [2, 5, 5]. - */ - function toBaseOut( str, baseIn, baseOut ) { - var j, - arr = [0], - arrL, - i = 0, - len = str.length; - - for ( ; i < len; ) { - for ( arrL = arr.length; arrL--; arr[arrL] *= baseIn ); - arr[ j = 0 ] += ALPHABET.indexOf( str.charAt( i++ ) ); - - for ( ; j < arr.length; j++ ) { - - if ( arr[j] > baseOut - 1 ) { - if ( arr[j + 1] == null ) arr[j + 1] = 0; - arr[j + 1] += arr[j] / baseOut | 0; - arr[j] %= baseOut; - } - } - } - - return arr.reverse(); - } - - - function toExponential( str, e ) { - return ( str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str ) + - ( e < 0 ? 'e' : 'e+' ) + e; - } - - - function toFixedPoint( str, e ) { - var len, z; - - // Negative exponent? - if ( e < 0 ) { - - // Prepend zeros. - for ( z = '0.'; ++e; z += '0' ); - str = z + str; - - // Positive exponent - } else { - len = str.length; - - // Append zeros. - if ( ++e > len ) { - for ( z = '0', e -= len; --e; z += '0' ); - str += z; - } else if ( e < len ) { - str = str.slice( 0, e ) + '.' + str.slice(e); - } - } - - return str; - } - - - function truncate(n) { - n = parseFloat(n); - return n < 0 ? mathceil(n) : mathfloor(n); - } - - - // EXPORT - - - BigNumber = constructorFactory(); - BigNumber['default'] = BigNumber.BigNumber = BigNumber; - - - // AMD. - if ( true ) { - !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () { return BigNumber; }).call(exports, __webpack_require__, exports, module), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - - // Node.js and other environments that support module.exports. - } else {} -})(this); - - -/***/ }), -/* 41 */ -/***/ (function(module, exports) { - -module.exports = require("buffer"); - -/***/ }), -/* 42 */ -/***/ (function(module, exports) { - - -module.exports = BufferList; -function BufferList() { - this.bufs = []; - this.size = 0; -} - -BufferList.prototype.shift = function shift() { - var buf = this.bufs.shift(); - - if (buf) { - this.size -= buf.length; - } - - return buf; -}; - -BufferList.prototype.push = function push(buf) { - if (!buf || !buf.length) { - return; - } - - this.bufs.push(buf); - this.size += buf.length; -}; - - -/***/ }), -/* 43 */ -/***/ (function(module, exports, __webpack_require__) { - -exports.ChangeUser = __webpack_require__(44); -exports.Handshake = __webpack_require__(67); -exports.Ping = __webpack_require__(68); -exports.Query = __webpack_require__(19); -exports.Quit = __webpack_require__(77); -exports.Sequence = __webpack_require__(3); -exports.Statistics = __webpack_require__(78); - - -/***/ }), -/* 44 */ -/***/ (function(module, exports, __webpack_require__) { - -var Sequence = __webpack_require__(3); -var Util = __webpack_require__(0); -var Packets = __webpack_require__(2); -var Auth = __webpack_require__(18); - -module.exports = ChangeUser; -Util.inherits(ChangeUser, Sequence); -function ChangeUser(options, callback) { - Sequence.call(this, options, callback); - - this._user = options.user; - this._password = options.password; - this._database = options.database; - this._charsetNumber = options.charsetNumber; - this._currentConfig = options.currentConfig; -} - -ChangeUser.prototype.start = function(handshakeInitializationPacket) { - var scrambleBuff = handshakeInitializationPacket.scrambleBuff(); - scrambleBuff = Auth.token(this._password, scrambleBuff); - - var packet = new Packets.ComChangeUserPacket({ - user : this._user, - scrambleBuff : scrambleBuff, - database : this._database, - charsetNumber : this._charsetNumber - }); - - this._currentConfig.user = this._user; - this._currentConfig.password = this._password; - this._currentConfig.database = this._database; - this._currentConfig.charsetNumber = this._charsetNumber; - - this.emit('packet', packet); -}; - -ChangeUser.prototype['ErrorPacket'] = function(packet) { - var err = this._packetToError(packet); - err.fatal = true; - this.end(err); -}; - - -/***/ }), -/* 45 */ -/***/ (function(module, exports) { - -module.exports = AuthSwitchRequestPacket; -function AuthSwitchRequestPacket(options) { - options = options || {}; - - this.status = 0xfe; - this.authMethodName = options.authMethodName; - this.authMethodData = options.authMethodData; -} - -AuthSwitchRequestPacket.prototype.parse = function parse(parser) { - this.status = parser.parseUnsignedNumber(1); - this.authMethodName = parser.parseNullTerminatedString(); - this.authMethodData = parser.parsePacketTerminatedBuffer(); -}; - -AuthSwitchRequestPacket.prototype.write = function write(writer) { - writer.writeUnsignedNumber(1, this.status); - writer.writeNullTerminatedString(this.authMethodName); - writer.writeBuffer(this.authMethodData); -}; - - -/***/ }), -/* 46 */ -/***/ (function(module, exports) { - -module.exports = AuthSwitchResponsePacket; -function AuthSwitchResponsePacket(options) { - options = options || {}; - - this.data = options.data; -} - -AuthSwitchResponsePacket.prototype.parse = function parse(parser) { - this.data = parser.parsePacketTerminatedBuffer(); -}; - -AuthSwitchResponsePacket.prototype.write = function write(writer) { - writer.writeBuffer(this.data); -}; - - -/***/ }), -/* 47 */ -/***/ (function(module, exports, __webpack_require__) { - -var Buffer = __webpack_require__(1).Buffer; - -module.exports = ClientAuthenticationPacket; -function ClientAuthenticationPacket(options) { - options = options || {}; - - this.clientFlags = options.clientFlags; - this.maxPacketSize = options.maxPacketSize; - this.charsetNumber = options.charsetNumber; - this.filler = undefined; - this.user = options.user; - this.scrambleBuff = options.scrambleBuff; - this.database = options.database; - this.protocol41 = options.protocol41; -} - -ClientAuthenticationPacket.prototype.parse = function(parser) { - if (this.protocol41) { - this.clientFlags = parser.parseUnsignedNumber(4); - this.maxPacketSize = parser.parseUnsignedNumber(4); - this.charsetNumber = parser.parseUnsignedNumber(1); - this.filler = parser.parseFiller(23); - this.user = parser.parseNullTerminatedString(); - this.scrambleBuff = parser.parseLengthCodedBuffer(); - this.database = parser.parseNullTerminatedString(); - } else { - this.clientFlags = parser.parseUnsignedNumber(2); - this.maxPacketSize = parser.parseUnsignedNumber(3); - this.user = parser.parseNullTerminatedString(); - this.scrambleBuff = parser.parseBuffer(8); - this.database = parser.parseLengthCodedBuffer(); - } -}; - -ClientAuthenticationPacket.prototype.write = function(writer) { - if (this.protocol41) { - writer.writeUnsignedNumber(4, this.clientFlags); - writer.writeUnsignedNumber(4, this.maxPacketSize); - writer.writeUnsignedNumber(1, this.charsetNumber); - writer.writeFiller(23); - writer.writeNullTerminatedString(this.user); - writer.writeLengthCodedBuffer(this.scrambleBuff); - writer.writeNullTerminatedString(this.database); - } else { - writer.writeUnsignedNumber(2, this.clientFlags); - writer.writeUnsignedNumber(3, this.maxPacketSize); - writer.writeNullTerminatedString(this.user); - writer.writeBuffer(this.scrambleBuff); - if (this.database && this.database.length) { - writer.writeFiller(1); - writer.writeBuffer(Buffer.from(this.database)); - } - } -}; - - -/***/ }), -/* 48 */ -/***/ (function(module, exports) { - -module.exports = ComChangeUserPacket; -function ComChangeUserPacket(options) { - options = options || {}; - - this.command = 0x11; - this.user = options.user; - this.scrambleBuff = options.scrambleBuff; - this.database = options.database; - this.charsetNumber = options.charsetNumber; -} - -ComChangeUserPacket.prototype.parse = function(parser) { - this.command = parser.parseUnsignedNumber(1); - this.user = parser.parseNullTerminatedString(); - this.scrambleBuff = parser.parseLengthCodedBuffer(); - this.database = parser.parseNullTerminatedString(); - this.charsetNumber = parser.parseUnsignedNumber(1); -}; - -ComChangeUserPacket.prototype.write = function(writer) { - writer.writeUnsignedNumber(1, this.command); - writer.writeNullTerminatedString(this.user); - writer.writeLengthCodedBuffer(this.scrambleBuff); - writer.writeNullTerminatedString(this.database); - writer.writeUnsignedNumber(2, this.charsetNumber); -}; - - -/***/ }), -/* 49 */ -/***/ (function(module, exports) { - -module.exports = ComPingPacket; -function ComPingPacket() { - this.command = 0x0e; -} - -ComPingPacket.prototype.write = function(writer) { - writer.writeUnsignedNumber(1, this.command); -}; - -ComPingPacket.prototype.parse = function(parser) { - this.command = parser.parseUnsignedNumber(1); -}; - - -/***/ }), -/* 50 */ -/***/ (function(module, exports) { - -module.exports = ComQueryPacket; -function ComQueryPacket(sql) { - this.command = 0x03; - this.sql = sql; -} - -ComQueryPacket.prototype.write = function(writer) { - writer.writeUnsignedNumber(1, this.command); - writer.writeString(this.sql); -}; - -ComQueryPacket.prototype.parse = function(parser) { - this.command = parser.parseUnsignedNumber(1); - this.sql = parser.parsePacketTerminatedString(); -}; - - -/***/ }), -/* 51 */ -/***/ (function(module, exports) { - -module.exports = ComQuitPacket; -function ComQuitPacket() { - this.command = 0x01; -} - -ComQuitPacket.prototype.parse = function parse(parser) { - this.command = parser.parseUnsignedNumber(1); -}; - -ComQuitPacket.prototype.write = function write(writer) { - writer.writeUnsignedNumber(1, this.command); -}; - - -/***/ }), -/* 52 */ -/***/ (function(module, exports) { - -module.exports = ComStatisticsPacket; -function ComStatisticsPacket() { - this.command = 0x09; -} - -ComStatisticsPacket.prototype.write = function(writer) { - writer.writeUnsignedNumber(1, this.command); -}; - -ComStatisticsPacket.prototype.parse = function(parser) { - this.command = parser.parseUnsignedNumber(1); -}; - - -/***/ }), -/* 53 */ -/***/ (function(module, exports) { - -module.exports = EmptyPacket; -function EmptyPacket() { -} - -EmptyPacket.prototype.write = function write() { -}; - - -/***/ }), -/* 54 */ -/***/ (function(module, exports) { - -module.exports = EofPacket; -function EofPacket(options) { - options = options || {}; - - this.fieldCount = undefined; - this.warningCount = options.warningCount; - this.serverStatus = options.serverStatus; - this.protocol41 = options.protocol41; -} - -EofPacket.prototype.parse = function(parser) { - this.fieldCount = parser.parseUnsignedNumber(1); - if (this.protocol41) { - this.warningCount = parser.parseUnsignedNumber(2); - this.serverStatus = parser.parseUnsignedNumber(2); - } -}; - -EofPacket.prototype.write = function(writer) { - writer.writeUnsignedNumber(1, 0xfe); - if (this.protocol41) { - writer.writeUnsignedNumber(2, this.warningCount); - writer.writeUnsignedNumber(2, this.serverStatus); - } -}; - - -/***/ }), -/* 55 */ -/***/ (function(module, exports) { - -module.exports = ErrorPacket; -function ErrorPacket(options) { - options = options || {}; - - this.fieldCount = options.fieldCount; - this.errno = options.errno; - this.sqlStateMarker = options.sqlStateMarker; - this.sqlState = options.sqlState; - this.message = options.message; -} - -ErrorPacket.prototype.parse = function(parser) { - this.fieldCount = parser.parseUnsignedNumber(1); - this.errno = parser.parseUnsignedNumber(2); - - // sqlStateMarker ('#' = 0x23) indicates error packet format - if (parser.peak() === 0x23) { - this.sqlStateMarker = parser.parseString(1); - this.sqlState = parser.parseString(5); - } - - this.message = parser.parsePacketTerminatedString(); -}; - -ErrorPacket.prototype.write = function(writer) { - writer.writeUnsignedNumber(1, 0xff); - writer.writeUnsignedNumber(2, this.errno); - - if (this.sqlStateMarker) { - writer.writeString(this.sqlStateMarker); - writer.writeString(this.sqlState); - } - - writer.writeString(this.message); -}; - - -/***/ }), -/* 56 */ -/***/ (function(module, exports) { - -module.exports = FieldPacket; -function FieldPacket(options) { - options = options || {}; - - this.catalog = options.catalog; - this.db = options.db; - this.table = options.table; - this.orgTable = options.orgTable; - this.name = options.name; - this.orgName = options.orgName; - this.charsetNr = options.charsetNr; - this.length = options.length; - this.type = options.type; - this.flags = options.flags; - this.decimals = options.decimals; - this.default = options.default; - this.zeroFill = options.zeroFill; - this.protocol41 = options.protocol41; -} - -FieldPacket.prototype.parse = function(parser) { - if (this.protocol41) { - this.catalog = parser.parseLengthCodedString(); - this.db = parser.parseLengthCodedString(); - this.table = parser.parseLengthCodedString(); - this.orgTable = parser.parseLengthCodedString(); - this.name = parser.parseLengthCodedString(); - this.orgName = parser.parseLengthCodedString(); - - if (parser.parseLengthCodedNumber() !== 0x0c) { - var err = new TypeError('Received invalid field length'); - err.code = 'PARSER_INVALID_FIELD_LENGTH'; - throw err; - } - - this.charsetNr = parser.parseUnsignedNumber(2); - this.length = parser.parseUnsignedNumber(4); - this.type = parser.parseUnsignedNumber(1); - this.flags = parser.parseUnsignedNumber(2); - this.decimals = parser.parseUnsignedNumber(1); - - var filler = parser.parseBuffer(2); - if (filler[0] !== 0x0 || filler[1] !== 0x0) { - var err = new TypeError('Received invalid filler'); - err.code = 'PARSER_INVALID_FILLER'; - throw err; - } - - // parsed flags - this.zeroFill = (this.flags & 0x0040 ? true : false); - - if (parser.reachedPacketEnd()) { - return; - } - - this.default = parser.parseLengthCodedString(); - } else { - this.table = parser.parseLengthCodedString(); - this.name = parser.parseLengthCodedString(); - this.length = parser.parseUnsignedNumber(parser.parseUnsignedNumber(1)); - this.type = parser.parseUnsignedNumber(parser.parseUnsignedNumber(1)); - } -}; - -FieldPacket.prototype.write = function(writer) { - if (this.protocol41) { - writer.writeLengthCodedString(this.catalog); - writer.writeLengthCodedString(this.db); - writer.writeLengthCodedString(this.table); - writer.writeLengthCodedString(this.orgTable); - writer.writeLengthCodedString(this.name); - writer.writeLengthCodedString(this.orgName); - - writer.writeLengthCodedNumber(0x0c); - writer.writeUnsignedNumber(2, this.charsetNr || 0); - writer.writeUnsignedNumber(4, this.length || 0); - writer.writeUnsignedNumber(1, this.type || 0); - writer.writeUnsignedNumber(2, this.flags || 0); - writer.writeUnsignedNumber(1, this.decimals || 0); - writer.writeFiller(2); - - if (this.default !== undefined) { - writer.writeLengthCodedString(this.default); - } - } else { - writer.writeLengthCodedString(this.table); - writer.writeLengthCodedString(this.name); - writer.writeUnsignedNumber(1, 0x01); - writer.writeUnsignedNumber(1, this.length); - writer.writeUnsignedNumber(1, 0x01); - writer.writeUnsignedNumber(1, this.type); - } -}; - - -/***/ }), -/* 57 */ -/***/ (function(module, exports, __webpack_require__) { - -var Buffer = __webpack_require__(1).Buffer; -var Client = __webpack_require__(10); - -module.exports = HandshakeInitializationPacket; -function HandshakeInitializationPacket(options) { - options = options || {}; - - this.protocolVersion = options.protocolVersion; - this.serverVersion = options.serverVersion; - this.threadId = options.threadId; - this.scrambleBuff1 = options.scrambleBuff1; - this.filler1 = options.filler1; - this.serverCapabilities1 = options.serverCapabilities1; - this.serverLanguage = options.serverLanguage; - this.serverStatus = options.serverStatus; - this.serverCapabilities2 = options.serverCapabilities2; - this.scrambleLength = options.scrambleLength; - this.filler2 = options.filler2; - this.scrambleBuff2 = options.scrambleBuff2; - this.filler3 = options.filler3; - this.pluginData = options.pluginData; - this.protocol41 = options.protocol41; - - if (this.protocol41) { - // force set the bit in serverCapabilities1 - this.serverCapabilities1 |= Client.CLIENT_PROTOCOL_41; - } -} - -HandshakeInitializationPacket.prototype.parse = function(parser) { - this.protocolVersion = parser.parseUnsignedNumber(1); - this.serverVersion = parser.parseNullTerminatedString(); - this.threadId = parser.parseUnsignedNumber(4); - this.scrambleBuff1 = parser.parseBuffer(8); - this.filler1 = parser.parseFiller(1); - this.serverCapabilities1 = parser.parseUnsignedNumber(2); - this.serverLanguage = parser.parseUnsignedNumber(1); - this.serverStatus = parser.parseUnsignedNumber(2); - - this.protocol41 = (this.serverCapabilities1 & (1 << 9)) > 0; - - if (this.protocol41) { - this.serverCapabilities2 = parser.parseUnsignedNumber(2); - this.scrambleLength = parser.parseUnsignedNumber(1); - this.filler2 = parser.parseFiller(10); - // scrambleBuff2 should be 0x00 terminated, but sphinx does not do this - // so we assume scrambleBuff2 to be 12 byte and treat the next byte as a - // filler byte. - this.scrambleBuff2 = parser.parseBuffer(12); - this.filler3 = parser.parseFiller(1); - } else { - this.filler2 = parser.parseFiller(13); - } - - if (parser.reachedPacketEnd()) { - return; - } - - // According to the docs this should be 0x00 terminated, but MariaDB does - // not do this, so we assume this string to be packet terminated. - this.pluginData = parser.parsePacketTerminatedString(); - - // However, if there is a trailing '\0', strip it - var lastChar = this.pluginData.length - 1; - if (this.pluginData[lastChar] === '\0') { - this.pluginData = this.pluginData.substr(0, lastChar); - } -}; - -HandshakeInitializationPacket.prototype.write = function(writer) { - writer.writeUnsignedNumber(1, this.protocolVersion); - writer.writeNullTerminatedString(this.serverVersion); - writer.writeUnsignedNumber(4, this.threadId); - writer.writeBuffer(this.scrambleBuff1); - writer.writeFiller(1); - writer.writeUnsignedNumber(2, this.serverCapabilities1); - writer.writeUnsignedNumber(1, this.serverLanguage); - writer.writeUnsignedNumber(2, this.serverStatus); - if (this.protocol41) { - writer.writeUnsignedNumber(2, this.serverCapabilities2); - writer.writeUnsignedNumber(1, this.scrambleLength); - writer.writeFiller(10); - } - writer.writeNullTerminatedBuffer(this.scrambleBuff2); - - if (this.pluginData !== undefined) { - writer.writeNullTerminatedString(this.pluginData); - } -}; - -HandshakeInitializationPacket.prototype.scrambleBuff = function() { - var buffer = null; - - if (typeof this.scrambleBuff2 === 'undefined') { - buffer = Buffer.from(this.scrambleBuff1); - } else { - buffer = Buffer.allocUnsafe(this.scrambleBuff1.length + this.scrambleBuff2.length); - this.scrambleBuff1.copy(buffer, 0); - this.scrambleBuff2.copy(buffer, this.scrambleBuff1.length); - } - - return buffer; -}; - - -/***/ }), -/* 58 */ -/***/ (function(module, exports) { - -module.exports = LocalDataFilePacket; - -/** - * Create a new LocalDataFilePacket - * @constructor - * @param {Buffer} data The data contents of the packet - * @public - */ -function LocalDataFilePacket(data) { - this.data = data; -} - -LocalDataFilePacket.prototype.write = function(writer) { - writer.writeBuffer(this.data); -}; - - -/***/ }), -/* 59 */ -/***/ (function(module, exports) { - - -// Language-neutral expression to match ER_UPDATE_INFO -var ER_UPDATE_INFO_REGEXP = /^[^:0-9]+: [0-9]+[^:0-9]+: ([0-9]+)[^:0-9]+: [0-9]+[^:0-9]*$/; - -module.exports = OkPacket; -function OkPacket(options) { - options = options || {}; - - this.fieldCount = undefined; - this.affectedRows = undefined; - this.insertId = undefined; - this.serverStatus = undefined; - this.warningCount = undefined; - this.message = undefined; - this.protocol41 = options.protocol41; -} - -OkPacket.prototype.parse = function(parser) { - this.fieldCount = parser.parseUnsignedNumber(1); - this.affectedRows = parser.parseLengthCodedNumber(); - this.insertId = parser.parseLengthCodedNumber(); - if (this.protocol41) { - this.serverStatus = parser.parseUnsignedNumber(2); - this.warningCount = parser.parseUnsignedNumber(2); - } - this.message = parser.parsePacketTerminatedString(); - this.changedRows = 0; - - var m = ER_UPDATE_INFO_REGEXP.exec(this.message); - if (m !== null) { - this.changedRows = parseInt(m[1], 10); - } -}; - -OkPacket.prototype.write = function(writer) { - writer.writeUnsignedNumber(1, 0x00); - writer.writeLengthCodedNumber(this.affectedRows || 0); - writer.writeLengthCodedNumber(this.insertId || 0); - if (this.protocol41) { - writer.writeUnsignedNumber(2, this.serverStatus || 0); - writer.writeUnsignedNumber(2, this.warningCount || 0); - } - writer.writeString(this.message); -}; - - -/***/ }), -/* 60 */ -/***/ (function(module, exports) { - -module.exports = OldPasswordPacket; -function OldPasswordPacket(options) { - options = options || {}; - - this.scrambleBuff = options.scrambleBuff; -} - -OldPasswordPacket.prototype.parse = function(parser) { - this.scrambleBuff = parser.parseNullTerminatedBuffer(); -}; - -OldPasswordPacket.prototype.write = function(writer) { - writer.writeBuffer(this.scrambleBuff); - writer.writeFiller(1); -}; - - -/***/ }), -/* 61 */ -/***/ (function(module, exports) { - -module.exports = ResultSetHeaderPacket; -function ResultSetHeaderPacket(options) { - options = options || {}; - - this.fieldCount = options.fieldCount; - this.extra = options.extra; -} - -ResultSetHeaderPacket.prototype.parse = function(parser) { - this.fieldCount = parser.parseLengthCodedNumber(); - - if (parser.reachedPacketEnd()) return; - - this.extra = (this.fieldCount === null) - ? parser.parsePacketTerminatedString() - : parser.parseLengthCodedNumber(); -}; - -ResultSetHeaderPacket.prototype.write = function(writer) { - writer.writeLengthCodedNumber(this.fieldCount); - - if (this.extra !== undefined) { - writer.writeLengthCodedNumber(this.extra); - } -}; - - -/***/ }), -/* 62 */ -/***/ (function(module, exports, __webpack_require__) { - -var Types = __webpack_require__(13); -var Charsets = __webpack_require__(16); -var Field = __webpack_require__(17); -var IEEE_754_BINARY_64_PRECISION = Math.pow(2, 53); - -module.exports = RowDataPacket; -function RowDataPacket() { -} - -Object.defineProperty(RowDataPacket.prototype, 'parse', { - configurable : true, - enumerable : false, - value : parse -}); - -Object.defineProperty(RowDataPacket.prototype, '_typeCast', { - configurable : true, - enumerable : false, - value : typeCast -}); - -function parse(parser, fieldPackets, typeCast, nestTables, connection) { - var self = this; - var next = function () { - return self._typeCast(fieldPacket, parser, connection.config.timezone, connection.config.supportBigNumbers, connection.config.bigNumberStrings, connection.config.dateStrings); - }; - - for (var i = 0; i < fieldPackets.length; i++) { - var fieldPacket = fieldPackets[i]; - var value; - - if (typeof typeCast === 'function') { - value = typeCast.apply(connection, [ new Field({ packet: fieldPacket, parser: parser }), next ]); - } else { - value = (typeCast) - ? this._typeCast(fieldPacket, parser, connection.config.timezone, connection.config.supportBigNumbers, connection.config.bigNumberStrings, connection.config.dateStrings) - : ( (fieldPacket.charsetNr === Charsets.BINARY) - ? parser.parseLengthCodedBuffer() - : parser.parseLengthCodedString() ); - } - - if (typeof nestTables === 'string' && nestTables.length) { - this[fieldPacket.table + nestTables + fieldPacket.name] = value; - } else if (nestTables) { - this[fieldPacket.table] = this[fieldPacket.table] || {}; - this[fieldPacket.table][fieldPacket.name] = value; - } else { - this[fieldPacket.name] = value; - } - } -} - -function typeCast(field, parser, timeZone, supportBigNumbers, bigNumberStrings, dateStrings) { - var numberString; - - switch (field.type) { - case Types.TIMESTAMP: - case Types.TIMESTAMP2: - case Types.DATE: - case Types.DATETIME: - case Types.DATETIME2: - case Types.NEWDATE: - var dateString = parser.parseLengthCodedString(); - - if (typeMatch(field.type, dateStrings)) { - return dateString; - } - - if (dateString === null) { - return null; - } - - var originalString = dateString; - if (field.type === Types.DATE) { - dateString += ' 00:00:00'; - } - - if (timeZone !== 'local') { - dateString += ' ' + timeZone; - } - - var dt = new Date(dateString); - if (isNaN(dt.getTime())) { - return originalString; - } - - return dt; - case Types.TINY: - case Types.SHORT: - case Types.LONG: - case Types.INT24: - case Types.YEAR: - case Types.FLOAT: - case Types.DOUBLE: - numberString = parser.parseLengthCodedString(); - return (numberString === null || (field.zeroFill && numberString[0] === '0')) - ? numberString : Number(numberString); - case Types.NEWDECIMAL: - case Types.LONGLONG: - numberString = parser.parseLengthCodedString(); - return (numberString === null || (field.zeroFill && numberString[0] === '0')) - ? numberString - : ((supportBigNumbers && (bigNumberStrings || (Number(numberString) >= IEEE_754_BINARY_64_PRECISION) || Number(numberString) <= -IEEE_754_BINARY_64_PRECISION)) - ? numberString - : Number(numberString)); - case Types.BIT: - return parser.parseLengthCodedBuffer(); - case Types.STRING: - case Types.VAR_STRING: - case Types.TINY_BLOB: - case Types.MEDIUM_BLOB: - case Types.LONG_BLOB: - case Types.BLOB: - return (field.charsetNr === Charsets.BINARY) - ? parser.parseLengthCodedBuffer() - : parser.parseLengthCodedString(); - case Types.GEOMETRY: - return parser.parseGeometryValue(); - default: - return parser.parseLengthCodedString(); - } -} - -function typeMatch(type, list) { - if (Array.isArray(list)) { - for (var i = 0; i < list.length; i++) { - if (Types[list[i]] === type) return true; - } - return false; - } else { - return Boolean(list); - } -} - - -/***/ }), -/* 63 */ -/***/ (function(module, exports, __webpack_require__) { - -// http://dev.mysql.com/doc/internals/en/ssl.html -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest - -var ClientConstants = __webpack_require__(10); - -module.exports = SSLRequestPacket; - -function SSLRequestPacket(options) { - options = options || {}; - this.clientFlags = options.clientFlags | ClientConstants.CLIENT_SSL; - this.maxPacketSize = options.maxPacketSize; - this.charsetNumber = options.charsetNumber; -} - -SSLRequestPacket.prototype.parse = function(parser) { - // TODO: check SSLRequest packet v41 vs pre v41 - this.clientFlags = parser.parseUnsignedNumber(4); - this.maxPacketSize = parser.parseUnsignedNumber(4); - this.charsetNumber = parser.parseUnsignedNumber(1); -}; - -SSLRequestPacket.prototype.write = function(writer) { - writer.writeUnsignedNumber(4, this.clientFlags); - writer.writeUnsignedNumber(4, this.maxPacketSize); - writer.writeUnsignedNumber(1, this.charsetNumber); - writer.writeFiller(23); -}; - - -/***/ }), -/* 64 */ -/***/ (function(module, exports) { - -module.exports = StatisticsPacket; -function StatisticsPacket() { - this.message = undefined; -} - -StatisticsPacket.prototype.parse = function(parser) { - this.message = parser.parsePacketTerminatedString(); - - var items = this.message.split(/\s\s/); - for (var i = 0; i < items.length; i++) { - var m = items[i].match(/^(.+)\:\s+(.+)$/); - if (m !== null) { - this[m[1].toLowerCase().replace(/\s/g, '_')] = Number(m[2]); - } - } -}; - -StatisticsPacket.prototype.write = function(writer) { - writer.writeString(this.message); -}; - - -/***/ }), -/* 65 */ -/***/ (function(module, exports) { - -module.exports = UseOldPasswordPacket; -function UseOldPasswordPacket(options) { - options = options || {}; - - this.firstByte = options.firstByte || 0xfe; -} - -UseOldPasswordPacket.prototype.parse = function(parser) { - this.firstByte = parser.parseUnsignedNumber(1); -}; - -UseOldPasswordPacket.prototype.write = function(writer) { - writer.writeUnsignedNumber(1, this.firstByte); -}; - - -/***/ }), -/* 66 */ -/***/ (function(module, exports) { - -/** - * MySQL error constants - * - * Extracted from version 5.7.19 - * - * !! Generated by generate-error-constants.js, do not modify by hand !! - */ - -exports.EE_CANTCREATEFILE = 1; -exports.EE_READ = 2; -exports.EE_WRITE = 3; -exports.EE_BADCLOSE = 4; -exports.EE_OUTOFMEMORY = 5; -exports.EE_DELETE = 6; -exports.EE_LINK = 7; -exports.EE_EOFERR = 9; -exports.EE_CANTLOCK = 10; -exports.EE_CANTUNLOCK = 11; -exports.EE_DIR = 12; -exports.EE_STAT = 13; -exports.EE_CANT_CHSIZE = 14; -exports.EE_CANT_OPEN_STREAM = 15; -exports.EE_GETWD = 16; -exports.EE_SETWD = 17; -exports.EE_LINK_WARNING = 18; -exports.EE_OPEN_WARNING = 19; -exports.EE_DISK_FULL = 20; -exports.EE_CANT_MKDIR = 21; -exports.EE_UNKNOWN_CHARSET = 22; -exports.EE_OUT_OF_FILERESOURCES = 23; -exports.EE_CANT_READLINK = 24; -exports.EE_CANT_SYMLINK = 25; -exports.EE_REALPATH = 26; -exports.EE_SYNC = 27; -exports.EE_UNKNOWN_COLLATION = 28; -exports.EE_FILENOTFOUND = 29; -exports.EE_FILE_NOT_CLOSED = 30; -exports.EE_CHANGE_OWNERSHIP = 31; -exports.EE_CHANGE_PERMISSIONS = 32; -exports.EE_CANT_SEEK = 33; -exports.EE_CAPACITY_EXCEEDED = 34; -exports.HA_ERR_KEY_NOT_FOUND = 120; -exports.HA_ERR_FOUND_DUPP_KEY = 121; -exports.HA_ERR_INTERNAL_ERROR = 122; -exports.HA_ERR_RECORD_CHANGED = 123; -exports.HA_ERR_WRONG_INDEX = 124; -exports.HA_ERR_CRASHED = 126; -exports.HA_ERR_WRONG_IN_RECORD = 127; -exports.HA_ERR_OUT_OF_MEM = 128; -exports.HA_ERR_NOT_A_TABLE = 130; -exports.HA_ERR_WRONG_COMMAND = 131; -exports.HA_ERR_OLD_FILE = 132; -exports.HA_ERR_NO_ACTIVE_RECORD = 133; -exports.HA_ERR_RECORD_DELETED = 134; -exports.HA_ERR_RECORD_FILE_FULL = 135; -exports.HA_ERR_INDEX_FILE_FULL = 136; -exports.HA_ERR_END_OF_FILE = 137; -exports.HA_ERR_UNSUPPORTED = 138; -exports.HA_ERR_TOO_BIG_ROW = 139; -exports.HA_WRONG_CREATE_OPTION = 140; -exports.HA_ERR_FOUND_DUPP_UNIQUE = 141; -exports.HA_ERR_UNKNOWN_CHARSET = 142; -exports.HA_ERR_WRONG_MRG_TABLE_DEF = 143; -exports.HA_ERR_CRASHED_ON_REPAIR = 144; -exports.HA_ERR_CRASHED_ON_USAGE = 145; -exports.HA_ERR_LOCK_WAIT_TIMEOUT = 146; -exports.HA_ERR_LOCK_TABLE_FULL = 147; -exports.HA_ERR_READ_ONLY_TRANSACTION = 148; -exports.HA_ERR_LOCK_DEADLOCK = 149; -exports.HA_ERR_CANNOT_ADD_FOREIGN = 150; -exports.HA_ERR_NO_REFERENCED_ROW = 151; -exports.HA_ERR_ROW_IS_REFERENCED = 152; -exports.HA_ERR_NO_SAVEPOINT = 153; -exports.HA_ERR_NON_UNIQUE_BLOCK_SIZE = 154; -exports.HA_ERR_NO_SUCH_TABLE = 155; -exports.HA_ERR_TABLE_EXIST = 156; -exports.HA_ERR_NO_CONNECTION = 157; -exports.HA_ERR_NULL_IN_SPATIAL = 158; -exports.HA_ERR_TABLE_DEF_CHANGED = 159; -exports.HA_ERR_NO_PARTITION_FOUND = 160; -exports.HA_ERR_RBR_LOGGING_FAILED = 161; -exports.HA_ERR_DROP_INDEX_FK = 162; -exports.HA_ERR_FOREIGN_DUPLICATE_KEY = 163; -exports.HA_ERR_TABLE_NEEDS_UPGRADE = 164; -exports.HA_ERR_TABLE_READONLY = 165; -exports.HA_ERR_AUTOINC_READ_FAILED = 166; -exports.HA_ERR_AUTOINC_ERANGE = 167; -exports.HA_ERR_GENERIC = 168; -exports.HA_ERR_RECORD_IS_THE_SAME = 169; -exports.HA_ERR_LOGGING_IMPOSSIBLE = 170; -exports.HA_ERR_CORRUPT_EVENT = 171; -exports.HA_ERR_NEW_FILE = 172; -exports.HA_ERR_ROWS_EVENT_APPLY = 173; -exports.HA_ERR_INITIALIZATION = 174; -exports.HA_ERR_FILE_TOO_SHORT = 175; -exports.HA_ERR_WRONG_CRC = 176; -exports.HA_ERR_TOO_MANY_CONCURRENT_TRXS = 177; -exports.HA_ERR_NOT_IN_LOCK_PARTITIONS = 178; -exports.HA_ERR_INDEX_COL_TOO_LONG = 179; -exports.HA_ERR_INDEX_CORRUPT = 180; -exports.HA_ERR_UNDO_REC_TOO_BIG = 181; -exports.HA_FTS_INVALID_DOCID = 182; -exports.HA_ERR_TABLE_IN_FK_CHECK = 183; -exports.HA_ERR_TABLESPACE_EXISTS = 184; -exports.HA_ERR_TOO_MANY_FIELDS = 185; -exports.HA_ERR_ROW_IN_WRONG_PARTITION = 186; -exports.HA_ERR_INNODB_READ_ONLY = 187; -exports.HA_ERR_FTS_EXCEED_RESULT_CACHE_LIMIT = 188; -exports.HA_ERR_TEMP_FILE_WRITE_FAILURE = 189; -exports.HA_ERR_INNODB_FORCED_RECOVERY = 190; -exports.HA_ERR_FTS_TOO_MANY_WORDS_IN_PHRASE = 191; -exports.HA_ERR_FK_DEPTH_EXCEEDED = 192; -exports.HA_MISSING_CREATE_OPTION = 193; -exports.HA_ERR_SE_OUT_OF_MEMORY = 194; -exports.HA_ERR_TABLE_CORRUPT = 195; -exports.HA_ERR_QUERY_INTERRUPTED = 196; -exports.HA_ERR_TABLESPACE_MISSING = 197; -exports.HA_ERR_TABLESPACE_IS_NOT_EMPTY = 198; -exports.HA_ERR_WRONG_FILE_NAME = 199; -exports.HA_ERR_NOT_ALLOWED_COMMAND = 200; -exports.HA_ERR_COMPUTE_FAILED = 201; -exports.ER_HASHCHK = 1000; -exports.ER_NISAMCHK = 1001; -exports.ER_NO = 1002; -exports.ER_YES = 1003; -exports.ER_CANT_CREATE_FILE = 1004; -exports.ER_CANT_CREATE_TABLE = 1005; -exports.ER_CANT_CREATE_DB = 1006; -exports.ER_DB_CREATE_EXISTS = 1007; -exports.ER_DB_DROP_EXISTS = 1008; -exports.ER_DB_DROP_DELETE = 1009; -exports.ER_DB_DROP_RMDIR = 1010; -exports.ER_CANT_DELETE_FILE = 1011; -exports.ER_CANT_FIND_SYSTEM_REC = 1012; -exports.ER_CANT_GET_STAT = 1013; -exports.ER_CANT_GET_WD = 1014; -exports.ER_CANT_LOCK = 1015; -exports.ER_CANT_OPEN_FILE = 1016; -exports.ER_FILE_NOT_FOUND = 1017; -exports.ER_CANT_READ_DIR = 1018; -exports.ER_CANT_SET_WD = 1019; -exports.ER_CHECKREAD = 1020; -exports.ER_DISK_FULL = 1021; -exports.ER_DUP_KEY = 1022; -exports.ER_ERROR_ON_CLOSE = 1023; -exports.ER_ERROR_ON_READ = 1024; -exports.ER_ERROR_ON_RENAME = 1025; -exports.ER_ERROR_ON_WRITE = 1026; -exports.ER_FILE_USED = 1027; -exports.ER_FILSORT_ABORT = 1028; -exports.ER_FORM_NOT_FOUND = 1029; -exports.ER_GET_ERRNO = 1030; -exports.ER_ILLEGAL_HA = 1031; -exports.ER_KEY_NOT_FOUND = 1032; -exports.ER_NOT_FORM_FILE = 1033; -exports.ER_NOT_KEYFILE = 1034; -exports.ER_OLD_KEYFILE = 1035; -exports.ER_OPEN_AS_READONLY = 1036; -exports.ER_OUTOFMEMORY = 1037; -exports.ER_OUT_OF_SORTMEMORY = 1038; -exports.ER_UNEXPECTED_EOF = 1039; -exports.ER_CON_COUNT_ERROR = 1040; -exports.ER_OUT_OF_RESOURCES = 1041; -exports.ER_BAD_HOST_ERROR = 1042; -exports.ER_HANDSHAKE_ERROR = 1043; -exports.ER_DBACCESS_DENIED_ERROR = 1044; -exports.ER_ACCESS_DENIED_ERROR = 1045; -exports.ER_NO_DB_ERROR = 1046; -exports.ER_UNKNOWN_COM_ERROR = 1047; -exports.ER_BAD_NULL_ERROR = 1048; -exports.ER_BAD_DB_ERROR = 1049; -exports.ER_TABLE_EXISTS_ERROR = 1050; -exports.ER_BAD_TABLE_ERROR = 1051; -exports.ER_NON_UNIQ_ERROR = 1052; -exports.ER_SERVER_SHUTDOWN = 1053; -exports.ER_BAD_FIELD_ERROR = 1054; -exports.ER_WRONG_FIELD_WITH_GROUP = 1055; -exports.ER_WRONG_GROUP_FIELD = 1056; -exports.ER_WRONG_SUM_SELECT = 1057; -exports.ER_WRONG_VALUE_COUNT = 1058; -exports.ER_TOO_LONG_IDENT = 1059; -exports.ER_DUP_FIELDNAME = 1060; -exports.ER_DUP_KEYNAME = 1061; -exports.ER_DUP_ENTRY = 1062; -exports.ER_WRONG_FIELD_SPEC = 1063; -exports.ER_PARSE_ERROR = 1064; -exports.ER_EMPTY_QUERY = 1065; -exports.ER_NONUNIQ_TABLE = 1066; -exports.ER_INVALID_DEFAULT = 1067; -exports.ER_MULTIPLE_PRI_KEY = 1068; -exports.ER_TOO_MANY_KEYS = 1069; -exports.ER_TOO_MANY_KEY_PARTS = 1070; -exports.ER_TOO_LONG_KEY = 1071; -exports.ER_KEY_COLUMN_DOES_NOT_EXITS = 1072; -exports.ER_BLOB_USED_AS_KEY = 1073; -exports.ER_TOO_BIG_FIELDLENGTH = 1074; -exports.ER_WRONG_AUTO_KEY = 1075; -exports.ER_READY = 1076; -exports.ER_NORMAL_SHUTDOWN = 1077; -exports.ER_GOT_SIGNAL = 1078; -exports.ER_SHUTDOWN_COMPLETE = 1079; -exports.ER_FORCING_CLOSE = 1080; -exports.ER_IPSOCK_ERROR = 1081; -exports.ER_NO_SUCH_INDEX = 1082; -exports.ER_WRONG_FIELD_TERMINATORS = 1083; -exports.ER_BLOBS_AND_NO_TERMINATED = 1084; -exports.ER_TEXTFILE_NOT_READABLE = 1085; -exports.ER_FILE_EXISTS_ERROR = 1086; -exports.ER_LOAD_INFO = 1087; -exports.ER_ALTER_INFO = 1088; -exports.ER_WRONG_SUB_KEY = 1089; -exports.ER_CANT_REMOVE_ALL_FIELDS = 1090; -exports.ER_CANT_DROP_FIELD_OR_KEY = 1091; -exports.ER_INSERT_INFO = 1092; -exports.ER_UPDATE_TABLE_USED = 1093; -exports.ER_NO_SUCH_THREAD = 1094; -exports.ER_KILL_DENIED_ERROR = 1095; -exports.ER_NO_TABLES_USED = 1096; -exports.ER_TOO_BIG_SET = 1097; -exports.ER_NO_UNIQUE_LOGFILE = 1098; -exports.ER_TABLE_NOT_LOCKED_FOR_WRITE = 1099; -exports.ER_TABLE_NOT_LOCKED = 1100; -exports.ER_BLOB_CANT_HAVE_DEFAULT = 1101; -exports.ER_WRONG_DB_NAME = 1102; -exports.ER_WRONG_TABLE_NAME = 1103; -exports.ER_TOO_BIG_SELECT = 1104; -exports.ER_UNKNOWN_ERROR = 1105; -exports.ER_UNKNOWN_PROCEDURE = 1106; -exports.ER_WRONG_PARAMCOUNT_TO_PROCEDURE = 1107; -exports.ER_WRONG_PARAMETERS_TO_PROCEDURE = 1108; -exports.ER_UNKNOWN_TABLE = 1109; -exports.ER_FIELD_SPECIFIED_TWICE = 1110; -exports.ER_INVALID_GROUP_FUNC_USE = 1111; -exports.ER_UNSUPPORTED_EXTENSION = 1112; -exports.ER_TABLE_MUST_HAVE_COLUMNS = 1113; -exports.ER_RECORD_FILE_FULL = 1114; -exports.ER_UNKNOWN_CHARACTER_SET = 1115; -exports.ER_TOO_MANY_TABLES = 1116; -exports.ER_TOO_MANY_FIELDS = 1117; -exports.ER_TOO_BIG_ROWSIZE = 1118; -exports.ER_STACK_OVERRUN = 1119; -exports.ER_WRONG_OUTER_JOIN = 1120; -exports.ER_NULL_COLUMN_IN_INDEX = 1121; -exports.ER_CANT_FIND_UDF = 1122; -exports.ER_CANT_INITIALIZE_UDF = 1123; -exports.ER_UDF_NO_PATHS = 1124; -exports.ER_UDF_EXISTS = 1125; -exports.ER_CANT_OPEN_LIBRARY = 1126; -exports.ER_CANT_FIND_DL_ENTRY = 1127; -exports.ER_FUNCTION_NOT_DEFINED = 1128; -exports.ER_HOST_IS_BLOCKED = 1129; -exports.ER_HOST_NOT_PRIVILEGED = 1130; -exports.ER_PASSWORD_ANONYMOUS_USER = 1131; -exports.ER_PASSWORD_NOT_ALLOWED = 1132; -exports.ER_PASSWORD_NO_MATCH = 1133; -exports.ER_UPDATE_INFO = 1134; -exports.ER_CANT_CREATE_THREAD = 1135; -exports.ER_WRONG_VALUE_COUNT_ON_ROW = 1136; -exports.ER_CANT_REOPEN_TABLE = 1137; -exports.ER_INVALID_USE_OF_NULL = 1138; -exports.ER_REGEXP_ERROR = 1139; -exports.ER_MIX_OF_GROUP_FUNC_AND_FIELDS = 1140; -exports.ER_NONEXISTING_GRANT = 1141; -exports.ER_TABLEACCESS_DENIED_ERROR = 1142; -exports.ER_COLUMNACCESS_DENIED_ERROR = 1143; -exports.ER_ILLEGAL_GRANT_FOR_TABLE = 1144; -exports.ER_GRANT_WRONG_HOST_OR_USER = 1145; -exports.ER_NO_SUCH_TABLE = 1146; -exports.ER_NONEXISTING_TABLE_GRANT = 1147; -exports.ER_NOT_ALLOWED_COMMAND = 1148; -exports.ER_SYNTAX_ERROR = 1149; -exports.ER_DELAYED_CANT_CHANGE_LOCK = 1150; -exports.ER_TOO_MANY_DELAYED_THREADS = 1151; -exports.ER_ABORTING_CONNECTION = 1152; -exports.ER_NET_PACKET_TOO_LARGE = 1153; -exports.ER_NET_READ_ERROR_FROM_PIPE = 1154; -exports.ER_NET_FCNTL_ERROR = 1155; -exports.ER_NET_PACKETS_OUT_OF_ORDER = 1156; -exports.ER_NET_UNCOMPRESS_ERROR = 1157; -exports.ER_NET_READ_ERROR = 1158; -exports.ER_NET_READ_INTERRUPTED = 1159; -exports.ER_NET_ERROR_ON_WRITE = 1160; -exports.ER_NET_WRITE_INTERRUPTED = 1161; -exports.ER_TOO_LONG_STRING = 1162; -exports.ER_TABLE_CANT_HANDLE_BLOB = 1163; -exports.ER_TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164; -exports.ER_DELAYED_INSERT_TABLE_LOCKED = 1165; -exports.ER_WRONG_COLUMN_NAME = 1166; -exports.ER_WRONG_KEY_COLUMN = 1167; -exports.ER_WRONG_MRG_TABLE = 1168; -exports.ER_DUP_UNIQUE = 1169; -exports.ER_BLOB_KEY_WITHOUT_LENGTH = 1170; -exports.ER_PRIMARY_CANT_HAVE_NULL = 1171; -exports.ER_TOO_MANY_ROWS = 1172; -exports.ER_REQUIRES_PRIMARY_KEY = 1173; -exports.ER_NO_RAID_COMPILED = 1174; -exports.ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175; -exports.ER_KEY_DOES_NOT_EXITS = 1176; -exports.ER_CHECK_NO_SUCH_TABLE = 1177; -exports.ER_CHECK_NOT_IMPLEMENTED = 1178; -exports.ER_CANT_DO_THIS_DURING_AN_TRANSACTION = 1179; -exports.ER_ERROR_DURING_COMMIT = 1180; -exports.ER_ERROR_DURING_ROLLBACK = 1181; -exports.ER_ERROR_DURING_FLUSH_LOGS = 1182; -exports.ER_ERROR_DURING_CHECKPOINT = 1183; -exports.ER_NEW_ABORTING_CONNECTION = 1184; -exports.ER_DUMP_NOT_IMPLEMENTED = 1185; -exports.ER_FLUSH_MASTER_BINLOG_CLOSED = 1186; -exports.ER_INDEX_REBUILD = 1187; -exports.ER_MASTER = 1188; -exports.ER_MASTER_NET_READ = 1189; -exports.ER_MASTER_NET_WRITE = 1190; -exports.ER_FT_MATCHING_KEY_NOT_FOUND = 1191; -exports.ER_LOCK_OR_ACTIVE_TRANSACTION = 1192; -exports.ER_UNKNOWN_SYSTEM_VARIABLE = 1193; -exports.ER_CRASHED_ON_USAGE = 1194; -exports.ER_CRASHED_ON_REPAIR = 1195; -exports.ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196; -exports.ER_TRANS_CACHE_FULL = 1197; -exports.ER_SLAVE_MUST_STOP = 1198; -exports.ER_SLAVE_NOT_RUNNING = 1199; -exports.ER_BAD_SLAVE = 1200; -exports.ER_MASTER_INFO = 1201; -exports.ER_SLAVE_THREAD = 1202; -exports.ER_TOO_MANY_USER_CONNECTIONS = 1203; -exports.ER_SET_CONSTANTS_ONLY = 1204; -exports.ER_LOCK_WAIT_TIMEOUT = 1205; -exports.ER_LOCK_TABLE_FULL = 1206; -exports.ER_READ_ONLY_TRANSACTION = 1207; -exports.ER_DROP_DB_WITH_READ_LOCK = 1208; -exports.ER_CREATE_DB_WITH_READ_LOCK = 1209; -exports.ER_WRONG_ARGUMENTS = 1210; -exports.ER_NO_PERMISSION_TO_CREATE_USER = 1211; -exports.ER_UNION_TABLES_IN_DIFFERENT_DIR = 1212; -exports.ER_LOCK_DEADLOCK = 1213; -exports.ER_TABLE_CANT_HANDLE_FT = 1214; -exports.ER_CANNOT_ADD_FOREIGN = 1215; -exports.ER_NO_REFERENCED_ROW = 1216; -exports.ER_ROW_IS_REFERENCED = 1217; -exports.ER_CONNECT_TO_MASTER = 1218; -exports.ER_QUERY_ON_MASTER = 1219; -exports.ER_ERROR_WHEN_EXECUTING_COMMAND = 1220; -exports.ER_WRONG_USAGE = 1221; -exports.ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222; -exports.ER_CANT_UPDATE_WITH_READLOCK = 1223; -exports.ER_MIXING_NOT_ALLOWED = 1224; -exports.ER_DUP_ARGUMENT = 1225; -exports.ER_USER_LIMIT_REACHED = 1226; -exports.ER_SPECIFIC_ACCESS_DENIED_ERROR = 1227; -exports.ER_LOCAL_VARIABLE = 1228; -exports.ER_GLOBAL_VARIABLE = 1229; -exports.ER_NO_DEFAULT = 1230; -exports.ER_WRONG_VALUE_FOR_VAR = 1231; -exports.ER_WRONG_TYPE_FOR_VAR = 1232; -exports.ER_VAR_CANT_BE_READ = 1233; -exports.ER_CANT_USE_OPTION_HERE = 1234; -exports.ER_NOT_SUPPORTED_YET = 1235; -exports.ER_MASTER_FATAL_ERROR_READING_BINLOG = 1236; -exports.ER_SLAVE_IGNORED_TABLE = 1237; -exports.ER_INCORRECT_GLOBAL_LOCAL_VAR = 1238; -exports.ER_WRONG_FK_DEF = 1239; -exports.ER_KEY_REF_DO_NOT_MATCH_TABLE_REF = 1240; -exports.ER_OPERAND_COLUMNS = 1241; -exports.ER_SUBQUERY_NO_1_ROW = 1242; -exports.ER_UNKNOWN_STMT_HANDLER = 1243; -exports.ER_CORRUPT_HELP_DB = 1244; -exports.ER_CYCLIC_REFERENCE = 1245; -exports.ER_AUTO_CONVERT = 1246; -exports.ER_ILLEGAL_REFERENCE = 1247; -exports.ER_DERIVED_MUST_HAVE_ALIAS = 1248; -exports.ER_SELECT_REDUCED = 1249; -exports.ER_TABLENAME_NOT_ALLOWED_HERE = 1250; -exports.ER_NOT_SUPPORTED_AUTH_MODE = 1251; -exports.ER_SPATIAL_CANT_HAVE_NULL = 1252; -exports.ER_COLLATION_CHARSET_MISMATCH = 1253; -exports.ER_SLAVE_WAS_RUNNING = 1254; -exports.ER_SLAVE_WAS_NOT_RUNNING = 1255; -exports.ER_TOO_BIG_FOR_UNCOMPRESS = 1256; -exports.ER_ZLIB_Z_MEM_ERROR = 1257; -exports.ER_ZLIB_Z_BUF_ERROR = 1258; -exports.ER_ZLIB_Z_DATA_ERROR = 1259; -exports.ER_CUT_VALUE_GROUP_CONCAT = 1260; -exports.ER_WARN_TOO_FEW_RECORDS = 1261; -exports.ER_WARN_TOO_MANY_RECORDS = 1262; -exports.ER_WARN_NULL_TO_NOTNULL = 1263; -exports.ER_WARN_DATA_OUT_OF_RANGE = 1264; -exports.WARN_DATA_TRUNCATED = 1265; -exports.ER_WARN_USING_OTHER_HANDLER = 1266; -exports.ER_CANT_AGGREGATE_2COLLATIONS = 1267; -exports.ER_DROP_USER = 1268; -exports.ER_REVOKE_GRANTS = 1269; -exports.ER_CANT_AGGREGATE_3COLLATIONS = 1270; -exports.ER_CANT_AGGREGATE_NCOLLATIONS = 1271; -exports.ER_VARIABLE_IS_NOT_STRUCT = 1272; -exports.ER_UNKNOWN_COLLATION = 1273; -exports.ER_SLAVE_IGNORED_SSL_PARAMS = 1274; -exports.ER_SERVER_IS_IN_SECURE_AUTH_MODE = 1275; -exports.ER_WARN_FIELD_RESOLVED = 1276; -exports.ER_BAD_SLAVE_UNTIL_COND = 1277; -exports.ER_MISSING_SKIP_SLAVE = 1278; -exports.ER_UNTIL_COND_IGNORED = 1279; -exports.ER_WRONG_NAME_FOR_INDEX = 1280; -exports.ER_WRONG_NAME_FOR_CATALOG = 1281; -exports.ER_WARN_QC_RESIZE = 1282; -exports.ER_BAD_FT_COLUMN = 1283; -exports.ER_UNKNOWN_KEY_CACHE = 1284; -exports.ER_WARN_HOSTNAME_WONT_WORK = 1285; -exports.ER_UNKNOWN_STORAGE_ENGINE = 1286; -exports.ER_WARN_DEPRECATED_SYNTAX = 1287; -exports.ER_NON_UPDATABLE_TABLE = 1288; -exports.ER_FEATURE_DISABLED = 1289; -exports.ER_OPTION_PREVENTS_STATEMENT = 1290; -exports.ER_DUPLICATED_VALUE_IN_TYPE = 1291; -exports.ER_TRUNCATED_WRONG_VALUE = 1292; -exports.ER_TOO_MUCH_AUTO_TIMESTAMP_COLS = 1293; -exports.ER_INVALID_ON_UPDATE = 1294; -exports.ER_UNSUPPORTED_PS = 1295; -exports.ER_GET_ERRMSG = 1296; -exports.ER_GET_TEMPORARY_ERRMSG = 1297; -exports.ER_UNKNOWN_TIME_ZONE = 1298; -exports.ER_WARN_INVALID_TIMESTAMP = 1299; -exports.ER_INVALID_CHARACTER_STRING = 1300; -exports.ER_WARN_ALLOWED_PACKET_OVERFLOWED = 1301; -exports.ER_CONFLICTING_DECLARATIONS = 1302; -exports.ER_SP_NO_RECURSIVE_CREATE = 1303; -exports.ER_SP_ALREADY_EXISTS = 1304; -exports.ER_SP_DOES_NOT_EXIST = 1305; -exports.ER_SP_DROP_FAILED = 1306; -exports.ER_SP_STORE_FAILED = 1307; -exports.ER_SP_LILABEL_MISMATCH = 1308; -exports.ER_SP_LABEL_REDEFINE = 1309; -exports.ER_SP_LABEL_MISMATCH = 1310; -exports.ER_SP_UNINIT_VAR = 1311; -exports.ER_SP_BADSELECT = 1312; -exports.ER_SP_BADRETURN = 1313; -exports.ER_SP_BADSTATEMENT = 1314; -exports.ER_UPDATE_LOG_DEPRECATED_IGNORED = 1315; -exports.ER_UPDATE_LOG_DEPRECATED_TRANSLATED = 1316; -exports.ER_QUERY_INTERRUPTED = 1317; -exports.ER_SP_WRONG_NO_OF_ARGS = 1318; -exports.ER_SP_COND_MISMATCH = 1319; -exports.ER_SP_NORETURN = 1320; -exports.ER_SP_NORETURNEND = 1321; -exports.ER_SP_BAD_CURSOR_QUERY = 1322; -exports.ER_SP_BAD_CURSOR_SELECT = 1323; -exports.ER_SP_CURSOR_MISMATCH = 1324; -exports.ER_SP_CURSOR_ALREADY_OPEN = 1325; -exports.ER_SP_CURSOR_NOT_OPEN = 1326; -exports.ER_SP_UNDECLARED_VAR = 1327; -exports.ER_SP_WRONG_NO_OF_FETCH_ARGS = 1328; -exports.ER_SP_FETCH_NO_DATA = 1329; -exports.ER_SP_DUP_PARAM = 1330; -exports.ER_SP_DUP_VAR = 1331; -exports.ER_SP_DUP_COND = 1332; -exports.ER_SP_DUP_CURS = 1333; -exports.ER_SP_CANT_ALTER = 1334; -exports.ER_SP_SUBSELECT_NYI = 1335; -exports.ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG = 1336; -exports.ER_SP_VARCOND_AFTER_CURSHNDLR = 1337; -exports.ER_SP_CURSOR_AFTER_HANDLER = 1338; -exports.ER_SP_CASE_NOT_FOUND = 1339; -exports.ER_FPARSER_TOO_BIG_FILE = 1340; -exports.ER_FPARSER_BAD_HEADER = 1341; -exports.ER_FPARSER_EOF_IN_COMMENT = 1342; -exports.ER_FPARSER_ERROR_IN_PARAMETER = 1343; -exports.ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344; -exports.ER_VIEW_NO_EXPLAIN = 1345; -exports.ER_FRM_UNKNOWN_TYPE = 1346; -exports.ER_WRONG_OBJECT = 1347; -exports.ER_NONUPDATEABLE_COLUMN = 1348; -exports.ER_VIEW_SELECT_DERIVED = 1349; -exports.ER_VIEW_SELECT_CLAUSE = 1350; -exports.ER_VIEW_SELECT_VARIABLE = 1351; -exports.ER_VIEW_SELECT_TMPTABLE = 1352; -exports.ER_VIEW_WRONG_LIST = 1353; -exports.ER_WARN_VIEW_MERGE = 1354; -exports.ER_WARN_VIEW_WITHOUT_KEY = 1355; -exports.ER_VIEW_INVALID = 1356; -exports.ER_SP_NO_DROP_SP = 1357; -exports.ER_SP_GOTO_IN_HNDLR = 1358; -exports.ER_TRG_ALREADY_EXISTS = 1359; -exports.ER_TRG_DOES_NOT_EXIST = 1360; -exports.ER_TRG_ON_VIEW_OR_TEMP_TABLE = 1361; -exports.ER_TRG_CANT_CHANGE_ROW = 1362; -exports.ER_TRG_NO_SUCH_ROW_IN_TRG = 1363; -exports.ER_NO_DEFAULT_FOR_FIELD = 1364; -exports.ER_DIVISION_BY_ZERO = 1365; -exports.ER_TRUNCATED_WRONG_VALUE_FOR_FIELD = 1366; -exports.ER_ILLEGAL_VALUE_FOR_TYPE = 1367; -exports.ER_VIEW_NONUPD_CHECK = 1368; -exports.ER_VIEW_CHECK_FAILED = 1369; -exports.ER_PROCACCESS_DENIED_ERROR = 1370; -exports.ER_RELAY_LOG_FAIL = 1371; -exports.ER_PASSWD_LENGTH = 1372; -exports.ER_UNKNOWN_TARGET_BINLOG = 1373; -exports.ER_IO_ERR_LOG_INDEX_READ = 1374; -exports.ER_BINLOG_PURGE_PROHIBITED = 1375; -exports.ER_FSEEK_FAIL = 1376; -exports.ER_BINLOG_PURGE_FATAL_ERR = 1377; -exports.ER_LOG_IN_USE = 1378; -exports.ER_LOG_PURGE_UNKNOWN_ERR = 1379; -exports.ER_RELAY_LOG_INIT = 1380; -exports.ER_NO_BINARY_LOGGING = 1381; -exports.ER_RESERVED_SYNTAX = 1382; -exports.ER_WSAS_FAILED = 1383; -exports.ER_DIFF_GROUPS_PROC = 1384; -exports.ER_NO_GROUP_FOR_PROC = 1385; -exports.ER_ORDER_WITH_PROC = 1386; -exports.ER_LOGGING_PROHIBIT_CHANGING_OF = 1387; -exports.ER_NO_FILE_MAPPING = 1388; -exports.ER_WRONG_MAGIC = 1389; -exports.ER_PS_MANY_PARAM = 1390; -exports.ER_KEY_PART_0 = 1391; -exports.ER_VIEW_CHECKSUM = 1392; -exports.ER_VIEW_MULTIUPDATE = 1393; -exports.ER_VIEW_NO_INSERT_FIELD_LIST = 1394; -exports.ER_VIEW_DELETE_MERGE_VIEW = 1395; -exports.ER_CANNOT_USER = 1396; -exports.ER_XAER_NOTA = 1397; -exports.ER_XAER_INVAL = 1398; -exports.ER_XAER_RMFAIL = 1399; -exports.ER_XAER_OUTSIDE = 1400; -exports.ER_XAER_RMERR = 1401; -exports.ER_XA_RBROLLBACK = 1402; -exports.ER_NONEXISTING_PROC_GRANT = 1403; -exports.ER_PROC_AUTO_GRANT_FAIL = 1404; -exports.ER_PROC_AUTO_REVOKE_FAIL = 1405; -exports.ER_DATA_TOO_LONG = 1406; -exports.ER_SP_BAD_SQLSTATE = 1407; -exports.ER_STARTUP = 1408; -exports.ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR = 1409; -exports.ER_CANT_CREATE_USER_WITH_GRANT = 1410; -exports.ER_WRONG_VALUE_FOR_TYPE = 1411; -exports.ER_TABLE_DEF_CHANGED = 1412; -exports.ER_SP_DUP_HANDLER = 1413; -exports.ER_SP_NOT_VAR_ARG = 1414; -exports.ER_SP_NO_RETSET = 1415; -exports.ER_CANT_CREATE_GEOMETRY_OBJECT = 1416; -exports.ER_FAILED_ROUTINE_BREAK_BINLOG = 1417; -exports.ER_BINLOG_UNSAFE_ROUTINE = 1418; -exports.ER_BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419; -exports.ER_EXEC_STMT_WITH_OPEN_CURSOR = 1420; -exports.ER_STMT_HAS_NO_OPEN_CURSOR = 1421; -exports.ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422; -exports.ER_NO_DEFAULT_FOR_VIEW_FIELD = 1423; -exports.ER_SP_NO_RECURSION = 1424; -exports.ER_TOO_BIG_SCALE = 1425; -exports.ER_TOO_BIG_PRECISION = 1426; -exports.ER_M_BIGGER_THAN_D = 1427; -exports.ER_WRONG_LOCK_OF_SYSTEM_TABLE = 1428; -exports.ER_CONNECT_TO_FOREIGN_DATA_SOURCE = 1429; -exports.ER_QUERY_ON_FOREIGN_DATA_SOURCE = 1430; -exports.ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431; -exports.ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432; -exports.ER_FOREIGN_DATA_STRING_INVALID = 1433; -exports.ER_CANT_CREATE_FEDERATED_TABLE = 1434; -exports.ER_TRG_IN_WRONG_SCHEMA = 1435; -exports.ER_STACK_OVERRUN_NEED_MORE = 1436; -exports.ER_TOO_LONG_BODY = 1437; -exports.ER_WARN_CANT_DROP_DEFAULT_KEYCACHE = 1438; -exports.ER_TOO_BIG_DISPLAYWIDTH = 1439; -exports.ER_XAER_DUPID = 1440; -exports.ER_DATETIME_FUNCTION_OVERFLOW = 1441; -exports.ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG = 1442; -exports.ER_VIEW_PREVENT_UPDATE = 1443; -exports.ER_PS_NO_RECURSION = 1444; -exports.ER_SP_CANT_SET_AUTOCOMMIT = 1445; -exports.ER_MALFORMED_DEFINER = 1446; -exports.ER_VIEW_FRM_NO_USER = 1447; -exports.ER_VIEW_OTHER_USER = 1448; -exports.ER_NO_SUCH_USER = 1449; -exports.ER_FORBID_SCHEMA_CHANGE = 1450; -exports.ER_ROW_IS_REFERENCED_2 = 1451; -exports.ER_NO_REFERENCED_ROW_2 = 1452; -exports.ER_SP_BAD_VAR_SHADOW = 1453; -exports.ER_TRG_NO_DEFINER = 1454; -exports.ER_OLD_FILE_FORMAT = 1455; -exports.ER_SP_RECURSION_LIMIT = 1456; -exports.ER_SP_PROC_TABLE_CORRUPT = 1457; -exports.ER_SP_WRONG_NAME = 1458; -exports.ER_TABLE_NEEDS_UPGRADE = 1459; -exports.ER_SP_NO_AGGREGATE = 1460; -exports.ER_MAX_PREPARED_STMT_COUNT_REACHED = 1461; -exports.ER_VIEW_RECURSIVE = 1462; -exports.ER_NON_GROUPING_FIELD_USED = 1463; -exports.ER_TABLE_CANT_HANDLE_SPKEYS = 1464; -exports.ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA = 1465; -exports.ER_REMOVED_SPACES = 1466; -exports.ER_AUTOINC_READ_FAILED = 1467; -exports.ER_USERNAME = 1468; -exports.ER_HOSTNAME = 1469; -exports.ER_WRONG_STRING_LENGTH = 1470; -exports.ER_NON_INSERTABLE_TABLE = 1471; -exports.ER_ADMIN_WRONG_MRG_TABLE = 1472; -exports.ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT = 1473; -exports.ER_NAME_BECOMES_EMPTY = 1474; -exports.ER_AMBIGUOUS_FIELD_TERM = 1475; -exports.ER_FOREIGN_SERVER_EXISTS = 1476; -exports.ER_FOREIGN_SERVER_DOESNT_EXIST = 1477; -exports.ER_ILLEGAL_HA_CREATE_OPTION = 1478; -exports.ER_PARTITION_REQUIRES_VALUES_ERROR = 1479; -exports.ER_PARTITION_WRONG_VALUES_ERROR = 1480; -exports.ER_PARTITION_MAXVALUE_ERROR = 1481; -exports.ER_PARTITION_SUBPARTITION_ERROR = 1482; -exports.ER_PARTITION_SUBPART_MIX_ERROR = 1483; -exports.ER_PARTITION_WRONG_NO_PART_ERROR = 1484; -exports.ER_PARTITION_WRONG_NO_SUBPART_ERROR = 1485; -exports.ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR = 1486; -exports.ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR = 1487; -exports.ER_FIELD_NOT_FOUND_PART_ERROR = 1488; -exports.ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR = 1489; -exports.ER_INCONSISTENT_PARTITION_INFO_ERROR = 1490; -exports.ER_PARTITION_FUNC_NOT_ALLOWED_ERROR = 1491; -exports.ER_PARTITIONS_MUST_BE_DEFINED_ERROR = 1492; -exports.ER_RANGE_NOT_INCREASING_ERROR = 1493; -exports.ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR = 1494; -exports.ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR = 1495; -exports.ER_PARTITION_ENTRY_ERROR = 1496; -exports.ER_MIX_HANDLER_ERROR = 1497; -exports.ER_PARTITION_NOT_DEFINED_ERROR = 1498; -exports.ER_TOO_MANY_PARTITIONS_ERROR = 1499; -exports.ER_SUBPARTITION_ERROR = 1500; -exports.ER_CANT_CREATE_HANDLER_FILE = 1501; -exports.ER_BLOB_FIELD_IN_PART_FUNC_ERROR = 1502; -exports.ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF = 1503; -exports.ER_NO_PARTS_ERROR = 1504; -exports.ER_PARTITION_MGMT_ON_NONPARTITIONED = 1505; -exports.ER_FOREIGN_KEY_ON_PARTITIONED = 1506; -exports.ER_DROP_PARTITION_NON_EXISTENT = 1507; -exports.ER_DROP_LAST_PARTITION = 1508; -exports.ER_COALESCE_ONLY_ON_HASH_PARTITION = 1509; -exports.ER_REORG_HASH_ONLY_ON_SAME_NO = 1510; -exports.ER_REORG_NO_PARAM_ERROR = 1511; -exports.ER_ONLY_ON_RANGE_LIST_PARTITION = 1512; -exports.ER_ADD_PARTITION_SUBPART_ERROR = 1513; -exports.ER_ADD_PARTITION_NO_NEW_PARTITION = 1514; -exports.ER_COALESCE_PARTITION_NO_PARTITION = 1515; -exports.ER_REORG_PARTITION_NOT_EXIST = 1516; -exports.ER_SAME_NAME_PARTITION = 1517; -exports.ER_NO_BINLOG_ERROR = 1518; -exports.ER_CONSECUTIVE_REORG_PARTITIONS = 1519; -exports.ER_REORG_OUTSIDE_RANGE = 1520; -exports.ER_PARTITION_FUNCTION_FAILURE = 1521; -exports.ER_PART_STATE_ERROR = 1522; -exports.ER_LIMITED_PART_RANGE = 1523; -exports.ER_PLUGIN_IS_NOT_LOADED = 1524; -exports.ER_WRONG_VALUE = 1525; -exports.ER_NO_PARTITION_FOR_GIVEN_VALUE = 1526; -exports.ER_FILEGROUP_OPTION_ONLY_ONCE = 1527; -exports.ER_CREATE_FILEGROUP_FAILED = 1528; -exports.ER_DROP_FILEGROUP_FAILED = 1529; -exports.ER_TABLESPACE_AUTO_EXTEND_ERROR = 1530; -exports.ER_WRONG_SIZE_NUMBER = 1531; -exports.ER_SIZE_OVERFLOW_ERROR = 1532; -exports.ER_ALTER_FILEGROUP_FAILED = 1533; -exports.ER_BINLOG_ROW_LOGGING_FAILED = 1534; -exports.ER_BINLOG_ROW_WRONG_TABLE_DEF = 1535; -exports.ER_BINLOG_ROW_RBR_TO_SBR = 1536; -exports.ER_EVENT_ALREADY_EXISTS = 1537; -exports.ER_EVENT_STORE_FAILED = 1538; -exports.ER_EVENT_DOES_NOT_EXIST = 1539; -exports.ER_EVENT_CANT_ALTER = 1540; -exports.ER_EVENT_DROP_FAILED = 1541; -exports.ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG = 1542; -exports.ER_EVENT_ENDS_BEFORE_STARTS = 1543; -exports.ER_EVENT_EXEC_TIME_IN_THE_PAST = 1544; -exports.ER_EVENT_OPEN_TABLE_FAILED = 1545; -exports.ER_EVENT_NEITHER_M_EXPR_NOR_M_AT = 1546; -exports.ER_COL_COUNT_DOESNT_MATCH_CORRUPTED = 1547; -exports.ER_CANNOT_LOAD_FROM_TABLE = 1548; -exports.ER_EVENT_CANNOT_DELETE = 1549; -exports.ER_EVENT_COMPILE_ERROR = 1550; -exports.ER_EVENT_SAME_NAME = 1551; -exports.ER_EVENT_DATA_TOO_LONG = 1552; -exports.ER_DROP_INDEX_FK = 1553; -exports.ER_WARN_DEPRECATED_SYNTAX_WITH_VER = 1554; -exports.ER_CANT_WRITE_LOCK_LOG_TABLE = 1555; -exports.ER_CANT_LOCK_LOG_TABLE = 1556; -exports.ER_FOREIGN_DUPLICATE_KEY = 1557; -exports.ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE = 1558; -exports.ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR = 1559; -exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1560; -exports.ER_NDB_CANT_SWITCH_BINLOG_FORMAT = 1561; -exports.ER_PARTITION_NO_TEMPORARY = 1562; -exports.ER_PARTITION_CONST_DOMAIN_ERROR = 1563; -exports.ER_PARTITION_FUNCTION_IS_NOT_ALLOWED = 1564; -exports.ER_DDL_LOG_ERROR = 1565; -exports.ER_NULL_IN_VALUES_LESS_THAN = 1566; -exports.ER_WRONG_PARTITION_NAME = 1567; -exports.ER_CANT_CHANGE_TX_CHARACTERISTICS = 1568; -exports.ER_DUP_ENTRY_AUTOINCREMENT_CASE = 1569; -exports.ER_EVENT_MODIFY_QUEUE_ERROR = 1570; -exports.ER_EVENT_SET_VAR_ERROR = 1571; -exports.ER_PARTITION_MERGE_ERROR = 1572; -exports.ER_CANT_ACTIVATE_LOG = 1573; -exports.ER_RBR_NOT_AVAILABLE = 1574; -exports.ER_BASE64_DECODE_ERROR = 1575; -exports.ER_EVENT_RECURSION_FORBIDDEN = 1576; -exports.ER_EVENTS_DB_ERROR = 1577; -exports.ER_ONLY_INTEGERS_ALLOWED = 1578; -exports.ER_UNSUPORTED_LOG_ENGINE = 1579; -exports.ER_BAD_LOG_STATEMENT = 1580; -exports.ER_CANT_RENAME_LOG_TABLE = 1581; -exports.ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT = 1582; -exports.ER_WRONG_PARAMETERS_TO_NATIVE_FCT = 1583; -exports.ER_WRONG_PARAMETERS_TO_STORED_FCT = 1584; -exports.ER_NATIVE_FCT_NAME_COLLISION = 1585; -exports.ER_DUP_ENTRY_WITH_KEY_NAME = 1586; -exports.ER_BINLOG_PURGE_EMFILE = 1587; -exports.ER_EVENT_CANNOT_CREATE_IN_THE_PAST = 1588; -exports.ER_EVENT_CANNOT_ALTER_IN_THE_PAST = 1589; -exports.ER_SLAVE_INCIDENT = 1590; -exports.ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT = 1591; -exports.ER_BINLOG_UNSAFE_STATEMENT = 1592; -exports.ER_SLAVE_FATAL_ERROR = 1593; -exports.ER_SLAVE_RELAY_LOG_READ_FAILURE = 1594; -exports.ER_SLAVE_RELAY_LOG_WRITE_FAILURE = 1595; -exports.ER_SLAVE_CREATE_EVENT_FAILURE = 1596; -exports.ER_SLAVE_MASTER_COM_FAILURE = 1597; -exports.ER_BINLOG_LOGGING_IMPOSSIBLE = 1598; -exports.ER_VIEW_NO_CREATION_CTX = 1599; -exports.ER_VIEW_INVALID_CREATION_CTX = 1600; -exports.ER_SR_INVALID_CREATION_CTX = 1601; -exports.ER_TRG_CORRUPTED_FILE = 1602; -exports.ER_TRG_NO_CREATION_CTX = 1603; -exports.ER_TRG_INVALID_CREATION_CTX = 1604; -exports.ER_EVENT_INVALID_CREATION_CTX = 1605; -exports.ER_TRG_CANT_OPEN_TABLE = 1606; -exports.ER_CANT_CREATE_SROUTINE = 1607; -exports.ER_NEVER_USED = 1608; -exports.ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT = 1609; -exports.ER_SLAVE_CORRUPT_EVENT = 1610; -exports.ER_LOAD_DATA_INVALID_COLUMN = 1611; -exports.ER_LOG_PURGE_NO_FILE = 1612; -exports.ER_XA_RBTIMEOUT = 1613; -exports.ER_XA_RBDEADLOCK = 1614; -exports.ER_NEED_REPREPARE = 1615; -exports.ER_DELAYED_NOT_SUPPORTED = 1616; -exports.WARN_NO_MASTER_INFO = 1617; -exports.WARN_OPTION_IGNORED = 1618; -exports.ER_PLUGIN_DELETE_BUILTIN = 1619; -exports.WARN_PLUGIN_BUSY = 1620; -exports.ER_VARIABLE_IS_READONLY = 1621; -exports.ER_WARN_ENGINE_TRANSACTION_ROLLBACK = 1622; -exports.ER_SLAVE_HEARTBEAT_FAILURE = 1623; -exports.ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE = 1624; -exports.ER_NDB_REPLICATION_SCHEMA_ERROR = 1625; -exports.ER_CONFLICT_FN_PARSE_ERROR = 1626; -exports.ER_EXCEPTIONS_WRITE_ERROR = 1627; -exports.ER_TOO_LONG_TABLE_COMMENT = 1628; -exports.ER_TOO_LONG_FIELD_COMMENT = 1629; -exports.ER_FUNC_INEXISTENT_NAME_COLLISION = 1630; -exports.ER_DATABASE_NAME = 1631; -exports.ER_TABLE_NAME = 1632; -exports.ER_PARTITION_NAME = 1633; -exports.ER_SUBPARTITION_NAME = 1634; -exports.ER_TEMPORARY_NAME = 1635; -exports.ER_RENAMED_NAME = 1636; -exports.ER_TOO_MANY_CONCURRENT_TRXS = 1637; -exports.WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED = 1638; -exports.ER_DEBUG_SYNC_TIMEOUT = 1639; -exports.ER_DEBUG_SYNC_HIT_LIMIT = 1640; -exports.ER_DUP_SIGNAL_SET = 1641; -exports.ER_SIGNAL_WARN = 1642; -exports.ER_SIGNAL_NOT_FOUND = 1643; -exports.ER_SIGNAL_EXCEPTION = 1644; -exports.ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER = 1645; -exports.ER_SIGNAL_BAD_CONDITION_TYPE = 1646; -exports.WARN_COND_ITEM_TRUNCATED = 1647; -exports.ER_COND_ITEM_TOO_LONG = 1648; -exports.ER_UNKNOWN_LOCALE = 1649; -exports.ER_SLAVE_IGNORE_SERVER_IDS = 1650; -exports.ER_QUERY_CACHE_DISABLED = 1651; -exports.ER_SAME_NAME_PARTITION_FIELD = 1652; -exports.ER_PARTITION_COLUMN_LIST_ERROR = 1653; -exports.ER_WRONG_TYPE_COLUMN_VALUE_ERROR = 1654; -exports.ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR = 1655; -exports.ER_MAXVALUE_IN_VALUES_IN = 1656; -exports.ER_TOO_MANY_VALUES_ERROR = 1657; -exports.ER_ROW_SINGLE_PARTITION_FIELD_ERROR = 1658; -exports.ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD = 1659; -exports.ER_PARTITION_FIELDS_TOO_LONG = 1660; -exports.ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE = 1661; -exports.ER_BINLOG_ROW_MODE_AND_STMT_ENGINE = 1662; -exports.ER_BINLOG_UNSAFE_AND_STMT_ENGINE = 1663; -exports.ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE = 1664; -exports.ER_BINLOG_STMT_MODE_AND_ROW_ENGINE = 1665; -exports.ER_BINLOG_ROW_INJECTION_AND_STMT_MODE = 1666; -exports.ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1667; -exports.ER_BINLOG_UNSAFE_LIMIT = 1668; -exports.ER_BINLOG_UNSAFE_INSERT_DELAYED = 1669; -exports.ER_BINLOG_UNSAFE_SYSTEM_TABLE = 1670; -exports.ER_BINLOG_UNSAFE_AUTOINC_COLUMNS = 1671; -exports.ER_BINLOG_UNSAFE_UDF = 1672; -exports.ER_BINLOG_UNSAFE_SYSTEM_VARIABLE = 1673; -exports.ER_BINLOG_UNSAFE_SYSTEM_FUNCTION = 1674; -exports.ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS = 1675; -exports.ER_MESSAGE_AND_STATEMENT = 1676; -exports.ER_SLAVE_CONVERSION_FAILED = 1677; -exports.ER_SLAVE_CANT_CREATE_CONVERSION = 1678; -exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1679; -exports.ER_PATH_LENGTH = 1680; -exports.ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT = 1681; -exports.ER_WRONG_NATIVE_TABLE_STRUCTURE = 1682; -exports.ER_WRONG_PERFSCHEMA_USAGE = 1683; -exports.ER_WARN_I_S_SKIPPED_TABLE = 1684; -exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1685; -exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1686; -exports.ER_SPATIAL_MUST_HAVE_GEOM_COL = 1687; -exports.ER_TOO_LONG_INDEX_COMMENT = 1688; -exports.ER_LOCK_ABORTED = 1689; -exports.ER_DATA_OUT_OF_RANGE = 1690; -exports.ER_WRONG_SPVAR_TYPE_IN_LIMIT = 1691; -exports.ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1692; -exports.ER_BINLOG_UNSAFE_MIXED_STATEMENT = 1693; -exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1694; -exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1695; -exports.ER_FAILED_READ_FROM_PAR_FILE = 1696; -exports.ER_VALUES_IS_NOT_INT_TYPE_ERROR = 1697; -exports.ER_ACCESS_DENIED_NO_PASSWORD_ERROR = 1698; -exports.ER_SET_PASSWORD_AUTH_PLUGIN = 1699; -exports.ER_GRANT_PLUGIN_USER_EXISTS = 1700; -exports.ER_TRUNCATE_ILLEGAL_FK = 1701; -exports.ER_PLUGIN_IS_PERMANENT = 1702; -exports.ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN = 1703; -exports.ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX = 1704; -exports.ER_STMT_CACHE_FULL = 1705; -exports.ER_MULTI_UPDATE_KEY_CONFLICT = 1706; -exports.ER_TABLE_NEEDS_REBUILD = 1707; -exports.WARN_OPTION_BELOW_LIMIT = 1708; -exports.ER_INDEX_COLUMN_TOO_LONG = 1709; -exports.ER_ERROR_IN_TRIGGER_BODY = 1710; -exports.ER_ERROR_IN_UNKNOWN_TRIGGER_BODY = 1711; -exports.ER_INDEX_CORRUPT = 1712; -exports.ER_UNDO_RECORD_TOO_BIG = 1713; -exports.ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT = 1714; -exports.ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE = 1715; -exports.ER_BINLOG_UNSAFE_REPLACE_SELECT = 1716; -exports.ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT = 1717; -exports.ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT = 1718; -exports.ER_BINLOG_UNSAFE_UPDATE_IGNORE = 1719; -exports.ER_PLUGIN_NO_UNINSTALL = 1720; -exports.ER_PLUGIN_NO_INSTALL = 1721; -exports.ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT = 1722; -exports.ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC = 1723; -exports.ER_BINLOG_UNSAFE_INSERT_TWO_KEYS = 1724; -exports.ER_TABLE_IN_FK_CHECK = 1725; -exports.ER_UNSUPPORTED_ENGINE = 1726; -exports.ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST = 1727; -exports.ER_CANNOT_LOAD_FROM_TABLE_V2 = 1728; -exports.ER_MASTER_DELAY_VALUE_OUT_OF_RANGE = 1729; -exports.ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT = 1730; -exports.ER_PARTITION_EXCHANGE_DIFFERENT_OPTION = 1731; -exports.ER_PARTITION_EXCHANGE_PART_TABLE = 1732; -exports.ER_PARTITION_EXCHANGE_TEMP_TABLE = 1733; -exports.ER_PARTITION_INSTEAD_OF_SUBPARTITION = 1734; -exports.ER_UNKNOWN_PARTITION = 1735; -exports.ER_TABLES_DIFFERENT_METADATA = 1736; -exports.ER_ROW_DOES_NOT_MATCH_PARTITION = 1737; -exports.ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX = 1738; -exports.ER_WARN_INDEX_NOT_APPLICABLE = 1739; -exports.ER_PARTITION_EXCHANGE_FOREIGN_KEY = 1740; -exports.ER_NO_SUCH_KEY_VALUE = 1741; -exports.ER_RPL_INFO_DATA_TOO_LONG = 1742; -exports.ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE = 1743; -exports.ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE = 1744; -exports.ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX = 1745; -exports.ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT = 1746; -exports.ER_PARTITION_CLAUSE_ON_NONPARTITIONED = 1747; -exports.ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET = 1748; -exports.ER_NO_SUCH_PARTITION = 1749; -exports.ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE = 1750; -exports.ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE = 1751; -exports.ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE = 1752; -exports.ER_MTS_FEATURE_IS_NOT_SUPPORTED = 1753; -exports.ER_MTS_UPDATED_DBS_GREATER_MAX = 1754; -exports.ER_MTS_CANT_PARALLEL = 1755; -exports.ER_MTS_INCONSISTENT_DATA = 1756; -exports.ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING = 1757; -exports.ER_DA_INVALID_CONDITION_NUMBER = 1758; -exports.ER_INSECURE_PLAIN_TEXT = 1759; -exports.ER_INSECURE_CHANGE_MASTER = 1760; -exports.ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO = 1761; -exports.ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO = 1762; -exports.ER_SQLTHREAD_WITH_SECURE_SLAVE = 1763; -exports.ER_TABLE_HAS_NO_FT = 1764; -exports.ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER = 1765; -exports.ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION = 1766; -exports.ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST = 1767; -exports.ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION = 1768; -exports.ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION = 1769; -exports.ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL = 1770; -exports.ER_SKIPPING_LOGGED_TRANSACTION = 1771; -exports.ER_MALFORMED_GTID_SET_SPECIFICATION = 1772; -exports.ER_MALFORMED_GTID_SET_ENCODING = 1773; -exports.ER_MALFORMED_GTID_SPECIFICATION = 1774; -exports.ER_GNO_EXHAUSTED = 1775; -exports.ER_BAD_SLAVE_AUTO_POSITION = 1776; -exports.ER_AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF = 1777; -exports.ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET = 1778; -exports.ER_GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON = 1779; -exports.ER_GTID_MODE_REQUIRES_BINLOG = 1780; -exports.ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF = 1781; -exports.ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON = 1782; -exports.ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF = 1783; -exports.ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF = 1784; -exports.ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE = 1785; -exports.ER_GTID_UNSAFE_CREATE_SELECT = 1786; -exports.ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION = 1787; -exports.ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME = 1788; -exports.ER_MASTER_HAS_PURGED_REQUIRED_GTIDS = 1789; -exports.ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID = 1790; -exports.ER_UNKNOWN_EXPLAIN_FORMAT = 1791; -exports.ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION = 1792; -exports.ER_TOO_LONG_TABLE_PARTITION_COMMENT = 1793; -exports.ER_SLAVE_CONFIGURATION = 1794; -exports.ER_INNODB_FT_LIMIT = 1795; -exports.ER_INNODB_NO_FT_TEMP_TABLE = 1796; -exports.ER_INNODB_FT_WRONG_DOCID_COLUMN = 1797; -exports.ER_INNODB_FT_WRONG_DOCID_INDEX = 1798; -exports.ER_INNODB_ONLINE_LOG_TOO_BIG = 1799; -exports.ER_UNKNOWN_ALTER_ALGORITHM = 1800; -exports.ER_UNKNOWN_ALTER_LOCK = 1801; -exports.ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS = 1802; -exports.ER_MTS_RECOVERY_FAILURE = 1803; -exports.ER_MTS_RESET_WORKERS = 1804; -exports.ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 = 1805; -exports.ER_SLAVE_SILENT_RETRY_TRANSACTION = 1806; -exports.ER_DISCARD_FK_CHECKS_RUNNING = 1807; -exports.ER_TABLE_SCHEMA_MISMATCH = 1808; -exports.ER_TABLE_IN_SYSTEM_TABLESPACE = 1809; -exports.ER_IO_READ_ERROR = 1810; -exports.ER_IO_WRITE_ERROR = 1811; -exports.ER_TABLESPACE_MISSING = 1812; -exports.ER_TABLESPACE_EXISTS = 1813; -exports.ER_TABLESPACE_DISCARDED = 1814; -exports.ER_INTERNAL_ERROR = 1815; -exports.ER_INNODB_IMPORT_ERROR = 1816; -exports.ER_INNODB_INDEX_CORRUPT = 1817; -exports.ER_INVALID_YEAR_COLUMN_LENGTH = 1818; -exports.ER_NOT_VALID_PASSWORD = 1819; -exports.ER_MUST_CHANGE_PASSWORD = 1820; -exports.ER_FK_NO_INDEX_CHILD = 1821; -exports.ER_FK_NO_INDEX_PARENT = 1822; -exports.ER_FK_FAIL_ADD_SYSTEM = 1823; -exports.ER_FK_CANNOT_OPEN_PARENT = 1824; -exports.ER_FK_INCORRECT_OPTION = 1825; -exports.ER_FK_DUP_NAME = 1826; -exports.ER_PASSWORD_FORMAT = 1827; -exports.ER_FK_COLUMN_CANNOT_DROP = 1828; -exports.ER_FK_COLUMN_CANNOT_DROP_CHILD = 1829; -exports.ER_FK_COLUMN_NOT_NULL = 1830; -exports.ER_DUP_INDEX = 1831; -exports.ER_FK_COLUMN_CANNOT_CHANGE = 1832; -exports.ER_FK_COLUMN_CANNOT_CHANGE_CHILD = 1833; -exports.ER_FK_CANNOT_DELETE_PARENT = 1834; -exports.ER_MALFORMED_PACKET = 1835; -exports.ER_READ_ONLY_MODE = 1836; -exports.ER_GTID_NEXT_TYPE_UNDEFINED_GROUP = 1837; -exports.ER_VARIABLE_NOT_SETTABLE_IN_SP = 1838; -exports.ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF = 1839; -exports.ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY = 1840; -exports.ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY = 1841; -exports.ER_GTID_PURGED_WAS_CHANGED = 1842; -exports.ER_GTID_EXECUTED_WAS_CHANGED = 1843; -exports.ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES = 1844; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED = 1845; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON = 1846; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY = 1847; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION = 1848; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME = 1849; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE = 1850; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK = 1851; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE = 1852; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK = 1853; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC = 1854; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS = 1855; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS = 1856; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS = 1857; -exports.ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE = 1858; -exports.ER_DUP_UNKNOWN_IN_INDEX = 1859; -exports.ER_IDENT_CAUSES_TOO_LONG_PATH = 1860; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL = 1861; -exports.ER_MUST_CHANGE_PASSWORD_LOGIN = 1862; -exports.ER_ROW_IN_WRONG_PARTITION = 1863; -exports.ER_MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX = 1864; -exports.ER_INNODB_NO_FT_USES_PARSER = 1865; -exports.ER_BINLOG_LOGICAL_CORRUPTION = 1866; -exports.ER_WARN_PURGE_LOG_IN_USE = 1867; -exports.ER_WARN_PURGE_LOG_IS_ACTIVE = 1868; -exports.ER_AUTO_INCREMENT_CONFLICT = 1869; -exports.WARN_ON_BLOCKHOLE_IN_RBR = 1870; -exports.ER_SLAVE_MI_INIT_REPOSITORY = 1871; -exports.ER_SLAVE_RLI_INIT_REPOSITORY = 1872; -exports.ER_ACCESS_DENIED_CHANGE_USER_ERROR = 1873; -exports.ER_INNODB_READ_ONLY = 1874; -exports.ER_STOP_SLAVE_SQL_THREAD_TIMEOUT = 1875; -exports.ER_STOP_SLAVE_IO_THREAD_TIMEOUT = 1876; -exports.ER_TABLE_CORRUPT = 1877; -exports.ER_TEMP_FILE_WRITE_FAILURE = 1878; -exports.ER_INNODB_FT_AUX_NOT_HEX_ID = 1879; -exports.ER_OLD_TEMPORALS_UPGRADED = 1880; -exports.ER_INNODB_FORCED_RECOVERY = 1881; -exports.ER_AES_INVALID_IV = 1882; -exports.ER_PLUGIN_CANNOT_BE_UNINSTALLED = 1883; -exports.ER_GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_GTID_GROUP = 1884; -exports.ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER = 1885; -exports.ER_FILE_CORRUPT = 3000; -exports.ER_ERROR_ON_MASTER = 3001; -exports.ER_INCONSISTENT_ERROR = 3002; -exports.ER_STORAGE_ENGINE_NOT_LOADED = 3003; -exports.ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER = 3004; -exports.ER_WARN_LEGACY_SYNTAX_CONVERTED = 3005; -exports.ER_BINLOG_UNSAFE_FULLTEXT_PLUGIN = 3006; -exports.ER_CANNOT_DISCARD_TEMPORARY_TABLE = 3007; -exports.ER_FK_DEPTH_EXCEEDED = 3008; -exports.ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2 = 3009; -exports.ER_WARN_TRIGGER_DOESNT_HAVE_CREATED = 3010; -exports.ER_REFERENCED_TRG_DOES_NOT_EXIST = 3011; -exports.ER_EXPLAIN_NOT_SUPPORTED = 3012; -exports.ER_INVALID_FIELD_SIZE = 3013; -exports.ER_MISSING_HA_CREATE_OPTION = 3014; -exports.ER_ENGINE_OUT_OF_MEMORY = 3015; -exports.ER_PASSWORD_EXPIRE_ANONYMOUS_USER = 3016; -exports.ER_SLAVE_SQL_THREAD_MUST_STOP = 3017; -exports.ER_NO_FT_MATERIALIZED_SUBQUERY = 3018; -exports.ER_INNODB_UNDO_LOG_FULL = 3019; -exports.ER_INVALID_ARGUMENT_FOR_LOGARITHM = 3020; -exports.ER_SLAVE_CHANNEL_IO_THREAD_MUST_STOP = 3021; -exports.ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO = 3022; -exports.ER_WARN_ONLY_MASTER_LOG_FILE_NO_POS = 3023; -exports.ER_QUERY_TIMEOUT = 3024; -exports.ER_NON_RO_SELECT_DISABLE_TIMER = 3025; -exports.ER_DUP_LIST_ENTRY = 3026; -exports.ER_SQL_MODE_NO_EFFECT = 3027; -exports.ER_AGGREGATE_ORDER_FOR_UNION = 3028; -exports.ER_AGGREGATE_ORDER_NON_AGG_QUERY = 3029; -exports.ER_SLAVE_WORKER_STOPPED_PREVIOUS_THD_ERROR = 3030; -exports.ER_DONT_SUPPORT_SLAVE_PRESERVE_COMMIT_ORDER = 3031; -exports.ER_SERVER_OFFLINE_MODE = 3032; -exports.ER_GIS_DIFFERENT_SRIDS = 3033; -exports.ER_GIS_UNSUPPORTED_ARGUMENT = 3034; -exports.ER_GIS_UNKNOWN_ERROR = 3035; -exports.ER_GIS_UNKNOWN_EXCEPTION = 3036; -exports.ER_GIS_INVALID_DATA = 3037; -exports.ER_BOOST_GEOMETRY_EMPTY_INPUT_EXCEPTION = 3038; -exports.ER_BOOST_GEOMETRY_CENTROID_EXCEPTION = 3039; -exports.ER_BOOST_GEOMETRY_OVERLAY_INVALID_INPUT_EXCEPTION = 3040; -exports.ER_BOOST_GEOMETRY_TURN_INFO_EXCEPTION = 3041; -exports.ER_BOOST_GEOMETRY_SELF_INTERSECTION_POINT_EXCEPTION = 3042; -exports.ER_BOOST_GEOMETRY_UNKNOWN_EXCEPTION = 3043; -exports.ER_STD_BAD_ALLOC_ERROR = 3044; -exports.ER_STD_DOMAIN_ERROR = 3045; -exports.ER_STD_LENGTH_ERROR = 3046; -exports.ER_STD_INVALID_ARGUMENT = 3047; -exports.ER_STD_OUT_OF_RANGE_ERROR = 3048; -exports.ER_STD_OVERFLOW_ERROR = 3049; -exports.ER_STD_RANGE_ERROR = 3050; -exports.ER_STD_UNDERFLOW_ERROR = 3051; -exports.ER_STD_LOGIC_ERROR = 3052; -exports.ER_STD_RUNTIME_ERROR = 3053; -exports.ER_STD_UNKNOWN_EXCEPTION = 3054; -exports.ER_GIS_DATA_WRONG_ENDIANESS = 3055; -exports.ER_CHANGE_MASTER_PASSWORD_LENGTH = 3056; -exports.ER_USER_LOCK_WRONG_NAME = 3057; -exports.ER_USER_LOCK_DEADLOCK = 3058; -exports.ER_REPLACE_INACCESSIBLE_ROWS = 3059; -exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_GIS = 3060; -exports.ER_ILLEGAL_USER_VAR = 3061; -exports.ER_GTID_MODE_OFF = 3062; -exports.ER_UNSUPPORTED_BY_REPLICATION_THREAD = 3063; -exports.ER_INCORRECT_TYPE = 3064; -exports.ER_FIELD_IN_ORDER_NOT_SELECT = 3065; -exports.ER_AGGREGATE_IN_ORDER_NOT_SELECT = 3066; -exports.ER_INVALID_RPL_WILD_TABLE_FILTER_PATTERN = 3067; -exports.ER_NET_OK_PACKET_TOO_LARGE = 3068; -exports.ER_INVALID_JSON_DATA = 3069; -exports.ER_INVALID_GEOJSON_MISSING_MEMBER = 3070; -exports.ER_INVALID_GEOJSON_WRONG_TYPE = 3071; -exports.ER_INVALID_GEOJSON_UNSPECIFIED = 3072; -exports.ER_DIMENSION_UNSUPPORTED = 3073; -exports.ER_SLAVE_CHANNEL_DOES_NOT_EXIST = 3074; -exports.ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT = 3075; -exports.ER_SLAVE_CHANNEL_NAME_INVALID_OR_TOO_LONG = 3076; -exports.ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORY = 3077; -exports.ER_SLAVE_CHANNEL_DELETE = 3078; -exports.ER_SLAVE_MULTIPLE_CHANNELS_CMD = 3079; -exports.ER_SLAVE_MAX_CHANNELS_EXCEEDED = 3080; -exports.ER_SLAVE_CHANNEL_MUST_STOP = 3081; -exports.ER_SLAVE_CHANNEL_NOT_RUNNING = 3082; -exports.ER_SLAVE_CHANNEL_WAS_RUNNING = 3083; -exports.ER_SLAVE_CHANNEL_WAS_NOT_RUNNING = 3084; -exports.ER_SLAVE_CHANNEL_SQL_THREAD_MUST_STOP = 3085; -exports.ER_SLAVE_CHANNEL_SQL_SKIP_COUNTER = 3086; -exports.ER_WRONG_FIELD_WITH_GROUP_V2 = 3087; -exports.ER_MIX_OF_GROUP_FUNC_AND_FIELDS_V2 = 3088; -exports.ER_WARN_DEPRECATED_SYSVAR_UPDATE = 3089; -exports.ER_WARN_DEPRECATED_SQLMODE = 3090; -exports.ER_CANNOT_LOG_PARTIAL_DROP_DATABASE_WITH_GTID = 3091; -exports.ER_GROUP_REPLICATION_CONFIGURATION = 3092; -exports.ER_GROUP_REPLICATION_RUNNING = 3093; -exports.ER_GROUP_REPLICATION_APPLIER_INIT_ERROR = 3094; -exports.ER_GROUP_REPLICATION_STOP_APPLIER_THREAD_TIMEOUT = 3095; -exports.ER_GROUP_REPLICATION_COMMUNICATION_LAYER_SESSION_ERROR = 3096; -exports.ER_GROUP_REPLICATION_COMMUNICATION_LAYER_JOIN_ERROR = 3097; -exports.ER_BEFORE_DML_VALIDATION_ERROR = 3098; -exports.ER_PREVENTS_VARIABLE_WITHOUT_RBR = 3099; -exports.ER_RUN_HOOK_ERROR = 3100; -exports.ER_TRANSACTION_ROLLBACK_DURING_COMMIT = 3101; -exports.ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED = 3102; -exports.ER_UNSUPPORTED_ALTER_INPLACE_ON_VIRTUAL_COLUMN = 3103; -exports.ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN = 3104; -exports.ER_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN = 3105; -exports.ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN = 3106; -exports.ER_GENERATED_COLUMN_NON_PRIOR = 3107; -exports.ER_DEPENDENT_BY_GENERATED_COLUMN = 3108; -exports.ER_GENERATED_COLUMN_REF_AUTO_INC = 3109; -exports.ER_FEATURE_NOT_AVAILABLE = 3110; -exports.ER_CANT_SET_GTID_MODE = 3111; -exports.ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF = 3112; -exports.ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION = 3113; -exports.ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON = 3114; -exports.ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF = 3115; -exports.ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS = 3116; -exports.ER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS = 3117; -exports.ER_ACCOUNT_HAS_BEEN_LOCKED = 3118; -exports.ER_WRONG_TABLESPACE_NAME = 3119; -exports.ER_TABLESPACE_IS_NOT_EMPTY = 3120; -exports.ER_WRONG_FILE_NAME = 3121; -exports.ER_BOOST_GEOMETRY_INCONSISTENT_TURNS_EXCEPTION = 3122; -exports.ER_WARN_OPTIMIZER_HINT_SYNTAX_ERROR = 3123; -exports.ER_WARN_BAD_MAX_EXECUTION_TIME = 3124; -exports.ER_WARN_UNSUPPORTED_MAX_EXECUTION_TIME = 3125; -exports.ER_WARN_CONFLICTING_HINT = 3126; -exports.ER_WARN_UNKNOWN_QB_NAME = 3127; -exports.ER_UNRESOLVED_HINT_NAME = 3128; -exports.ER_WARN_ON_MODIFYING_GTID_EXECUTED_TABLE = 3129; -exports.ER_PLUGGABLE_PROTOCOL_COMMAND_NOT_SUPPORTED = 3130; -exports.ER_LOCKING_SERVICE_WRONG_NAME = 3131; -exports.ER_LOCKING_SERVICE_DEADLOCK = 3132; -exports.ER_LOCKING_SERVICE_TIMEOUT = 3133; -exports.ER_GIS_MAX_POINTS_IN_GEOMETRY_OVERFLOWED = 3134; -exports.ER_SQL_MODE_MERGED = 3135; -exports.ER_VTOKEN_PLUGIN_TOKEN_MISMATCH = 3136; -exports.ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND = 3137; -exports.ER_CANT_SET_VARIABLE_WHEN_OWNING_GTID = 3138; -exports.ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED = 3139; -exports.ER_INVALID_JSON_TEXT = 3140; -exports.ER_INVALID_JSON_TEXT_IN_PARAM = 3141; -exports.ER_INVALID_JSON_BINARY_DATA = 3142; -exports.ER_INVALID_JSON_PATH = 3143; -exports.ER_INVALID_JSON_CHARSET = 3144; -exports.ER_INVALID_JSON_CHARSET_IN_FUNCTION = 3145; -exports.ER_INVALID_TYPE_FOR_JSON = 3146; -exports.ER_INVALID_CAST_TO_JSON = 3147; -exports.ER_INVALID_JSON_PATH_CHARSET = 3148; -exports.ER_INVALID_JSON_PATH_WILDCARD = 3149; -exports.ER_JSON_VALUE_TOO_BIG = 3150; -exports.ER_JSON_KEY_TOO_BIG = 3151; -exports.ER_JSON_USED_AS_KEY = 3152; -exports.ER_JSON_VACUOUS_PATH = 3153; -exports.ER_JSON_BAD_ONE_OR_ALL_ARG = 3154; -exports.ER_NUMERIC_JSON_VALUE_OUT_OF_RANGE = 3155; -exports.ER_INVALID_JSON_VALUE_FOR_CAST = 3156; -exports.ER_JSON_DOCUMENT_TOO_DEEP = 3157; -exports.ER_JSON_DOCUMENT_NULL_KEY = 3158; -exports.ER_SECURE_TRANSPORT_REQUIRED = 3159; -exports.ER_NO_SECURE_TRANSPORTS_CONFIGURED = 3160; -exports.ER_DISABLED_STORAGE_ENGINE = 3161; -exports.ER_USER_DOES_NOT_EXIST = 3162; -exports.ER_USER_ALREADY_EXISTS = 3163; -exports.ER_AUDIT_API_ABORT = 3164; -exports.ER_INVALID_JSON_PATH_ARRAY_CELL = 3165; -exports.ER_BUFPOOL_RESIZE_INPROGRESS = 3166; -exports.ER_FEATURE_DISABLED_SEE_DOC = 3167; -exports.ER_SERVER_ISNT_AVAILABLE = 3168; -exports.ER_SESSION_WAS_KILLED = 3169; -exports.ER_CAPACITY_EXCEEDED = 3170; -exports.ER_CAPACITY_EXCEEDED_IN_RANGE_OPTIMIZER = 3171; -exports.ER_TABLE_NEEDS_UPG_PART = 3172; -exports.ER_CANT_WAIT_FOR_EXECUTED_GTID_SET_WHILE_OWNING_A_GTID = 3173; -exports.ER_CANNOT_ADD_FOREIGN_BASE_COL_VIRTUAL = 3174; -exports.ER_CANNOT_CREATE_VIRTUAL_INDEX_CONSTRAINT = 3175; -exports.ER_ERROR_ON_MODIFYING_GTID_EXECUTED_TABLE = 3176; -exports.ER_LOCK_REFUSED_BY_ENGINE = 3177; -exports.ER_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN = 3178; -exports.ER_MASTER_KEY_ROTATION_NOT_SUPPORTED_BY_SE = 3179; -exports.ER_MASTER_KEY_ROTATION_ERROR_BY_SE = 3180; -exports.ER_MASTER_KEY_ROTATION_BINLOG_FAILED = 3181; -exports.ER_MASTER_KEY_ROTATION_SE_UNAVAILABLE = 3182; -exports.ER_TABLESPACE_CANNOT_ENCRYPT = 3183; -exports.ER_INVALID_ENCRYPTION_OPTION = 3184; -exports.ER_CANNOT_FIND_KEY_IN_KEYRING = 3185; -exports.ER_CAPACITY_EXCEEDED_IN_PARSER = 3186; -exports.ER_UNSUPPORTED_ALTER_ENCRYPTION_INPLACE = 3187; -exports.ER_KEYRING_UDF_KEYRING_SERVICE_ERROR = 3188; -exports.ER_USER_COLUMN_OLD_LENGTH = 3189; -exports.ER_CANT_RESET_MASTER = 3190; -exports.ER_GROUP_REPLICATION_MAX_GROUP_SIZE = 3191; -exports.ER_CANNOT_ADD_FOREIGN_BASE_COL_STORED = 3192; -exports.ER_TABLE_REFERENCED = 3193; -exports.ER_PARTITION_ENGINE_DEPRECATED_FOR_TABLE = 3194; -exports.ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO = 3195; -exports.ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID = 3196; -exports.ER_XA_RETRY = 3197; -exports.ER_KEYRING_AWS_UDF_AWS_KMS_ERROR = 3198; - -// Lookup-by-number table -exports[1] = 'EE_CANTCREATEFILE'; -exports[2] = 'EE_READ'; -exports[3] = 'EE_WRITE'; -exports[4] = 'EE_BADCLOSE'; -exports[5] = 'EE_OUTOFMEMORY'; -exports[6] = 'EE_DELETE'; -exports[7] = 'EE_LINK'; -exports[9] = 'EE_EOFERR'; -exports[10] = 'EE_CANTLOCK'; -exports[11] = 'EE_CANTUNLOCK'; -exports[12] = 'EE_DIR'; -exports[13] = 'EE_STAT'; -exports[14] = 'EE_CANT_CHSIZE'; -exports[15] = 'EE_CANT_OPEN_STREAM'; -exports[16] = 'EE_GETWD'; -exports[17] = 'EE_SETWD'; -exports[18] = 'EE_LINK_WARNING'; -exports[19] = 'EE_OPEN_WARNING'; -exports[20] = 'EE_DISK_FULL'; -exports[21] = 'EE_CANT_MKDIR'; -exports[22] = 'EE_UNKNOWN_CHARSET'; -exports[23] = 'EE_OUT_OF_FILERESOURCES'; -exports[24] = 'EE_CANT_READLINK'; -exports[25] = 'EE_CANT_SYMLINK'; -exports[26] = 'EE_REALPATH'; -exports[27] = 'EE_SYNC'; -exports[28] = 'EE_UNKNOWN_COLLATION'; -exports[29] = 'EE_FILENOTFOUND'; -exports[30] = 'EE_FILE_NOT_CLOSED'; -exports[31] = 'EE_CHANGE_OWNERSHIP'; -exports[32] = 'EE_CHANGE_PERMISSIONS'; -exports[33] = 'EE_CANT_SEEK'; -exports[34] = 'EE_CAPACITY_EXCEEDED'; -exports[120] = 'HA_ERR_KEY_NOT_FOUND'; -exports[121] = 'HA_ERR_FOUND_DUPP_KEY'; -exports[122] = 'HA_ERR_INTERNAL_ERROR'; -exports[123] = 'HA_ERR_RECORD_CHANGED'; -exports[124] = 'HA_ERR_WRONG_INDEX'; -exports[126] = 'HA_ERR_CRASHED'; -exports[127] = 'HA_ERR_WRONG_IN_RECORD'; -exports[128] = 'HA_ERR_OUT_OF_MEM'; -exports[130] = 'HA_ERR_NOT_A_TABLE'; -exports[131] = 'HA_ERR_WRONG_COMMAND'; -exports[132] = 'HA_ERR_OLD_FILE'; -exports[133] = 'HA_ERR_NO_ACTIVE_RECORD'; -exports[134] = 'HA_ERR_RECORD_DELETED'; -exports[135] = 'HA_ERR_RECORD_FILE_FULL'; -exports[136] = 'HA_ERR_INDEX_FILE_FULL'; -exports[137] = 'HA_ERR_END_OF_FILE'; -exports[138] = 'HA_ERR_UNSUPPORTED'; -exports[139] = 'HA_ERR_TOO_BIG_ROW'; -exports[140] = 'HA_WRONG_CREATE_OPTION'; -exports[141] = 'HA_ERR_FOUND_DUPP_UNIQUE'; -exports[142] = 'HA_ERR_UNKNOWN_CHARSET'; -exports[143] = 'HA_ERR_WRONG_MRG_TABLE_DEF'; -exports[144] = 'HA_ERR_CRASHED_ON_REPAIR'; -exports[145] = 'HA_ERR_CRASHED_ON_USAGE'; -exports[146] = 'HA_ERR_LOCK_WAIT_TIMEOUT'; -exports[147] = 'HA_ERR_LOCK_TABLE_FULL'; -exports[148] = 'HA_ERR_READ_ONLY_TRANSACTION'; -exports[149] = 'HA_ERR_LOCK_DEADLOCK'; -exports[150] = 'HA_ERR_CANNOT_ADD_FOREIGN'; -exports[151] = 'HA_ERR_NO_REFERENCED_ROW'; -exports[152] = 'HA_ERR_ROW_IS_REFERENCED'; -exports[153] = 'HA_ERR_NO_SAVEPOINT'; -exports[154] = 'HA_ERR_NON_UNIQUE_BLOCK_SIZE'; -exports[155] = 'HA_ERR_NO_SUCH_TABLE'; -exports[156] = 'HA_ERR_TABLE_EXIST'; -exports[157] = 'HA_ERR_NO_CONNECTION'; -exports[158] = 'HA_ERR_NULL_IN_SPATIAL'; -exports[159] = 'HA_ERR_TABLE_DEF_CHANGED'; -exports[160] = 'HA_ERR_NO_PARTITION_FOUND'; -exports[161] = 'HA_ERR_RBR_LOGGING_FAILED'; -exports[162] = 'HA_ERR_DROP_INDEX_FK'; -exports[163] = 'HA_ERR_FOREIGN_DUPLICATE_KEY'; -exports[164] = 'HA_ERR_TABLE_NEEDS_UPGRADE'; -exports[165] = 'HA_ERR_TABLE_READONLY'; -exports[166] = 'HA_ERR_AUTOINC_READ_FAILED'; -exports[167] = 'HA_ERR_AUTOINC_ERANGE'; -exports[168] = 'HA_ERR_GENERIC'; -exports[169] = 'HA_ERR_RECORD_IS_THE_SAME'; -exports[170] = 'HA_ERR_LOGGING_IMPOSSIBLE'; -exports[171] = 'HA_ERR_CORRUPT_EVENT'; -exports[172] = 'HA_ERR_NEW_FILE'; -exports[173] = 'HA_ERR_ROWS_EVENT_APPLY'; -exports[174] = 'HA_ERR_INITIALIZATION'; -exports[175] = 'HA_ERR_FILE_TOO_SHORT'; -exports[176] = 'HA_ERR_WRONG_CRC'; -exports[177] = 'HA_ERR_TOO_MANY_CONCURRENT_TRXS'; -exports[178] = 'HA_ERR_NOT_IN_LOCK_PARTITIONS'; -exports[179] = 'HA_ERR_INDEX_COL_TOO_LONG'; -exports[180] = 'HA_ERR_INDEX_CORRUPT'; -exports[181] = 'HA_ERR_UNDO_REC_TOO_BIG'; -exports[182] = 'HA_FTS_INVALID_DOCID'; -exports[183] = 'HA_ERR_TABLE_IN_FK_CHECK'; -exports[184] = 'HA_ERR_TABLESPACE_EXISTS'; -exports[185] = 'HA_ERR_TOO_MANY_FIELDS'; -exports[186] = 'HA_ERR_ROW_IN_WRONG_PARTITION'; -exports[187] = 'HA_ERR_INNODB_READ_ONLY'; -exports[188] = 'HA_ERR_FTS_EXCEED_RESULT_CACHE_LIMIT'; -exports[189] = 'HA_ERR_TEMP_FILE_WRITE_FAILURE'; -exports[190] = 'HA_ERR_INNODB_FORCED_RECOVERY'; -exports[191] = 'HA_ERR_FTS_TOO_MANY_WORDS_IN_PHRASE'; -exports[192] = 'HA_ERR_FK_DEPTH_EXCEEDED'; -exports[193] = 'HA_MISSING_CREATE_OPTION'; -exports[194] = 'HA_ERR_SE_OUT_OF_MEMORY'; -exports[195] = 'HA_ERR_TABLE_CORRUPT'; -exports[196] = 'HA_ERR_QUERY_INTERRUPTED'; -exports[197] = 'HA_ERR_TABLESPACE_MISSING'; -exports[198] = 'HA_ERR_TABLESPACE_IS_NOT_EMPTY'; -exports[199] = 'HA_ERR_WRONG_FILE_NAME'; -exports[200] = 'HA_ERR_NOT_ALLOWED_COMMAND'; -exports[201] = 'HA_ERR_COMPUTE_FAILED'; -exports[1000] = 'ER_HASHCHK'; -exports[1001] = 'ER_NISAMCHK'; -exports[1002] = 'ER_NO'; -exports[1003] = 'ER_YES'; -exports[1004] = 'ER_CANT_CREATE_FILE'; -exports[1005] = 'ER_CANT_CREATE_TABLE'; -exports[1006] = 'ER_CANT_CREATE_DB'; -exports[1007] = 'ER_DB_CREATE_EXISTS'; -exports[1008] = 'ER_DB_DROP_EXISTS'; -exports[1009] = 'ER_DB_DROP_DELETE'; -exports[1010] = 'ER_DB_DROP_RMDIR'; -exports[1011] = 'ER_CANT_DELETE_FILE'; -exports[1012] = 'ER_CANT_FIND_SYSTEM_REC'; -exports[1013] = 'ER_CANT_GET_STAT'; -exports[1014] = 'ER_CANT_GET_WD'; -exports[1015] = 'ER_CANT_LOCK'; -exports[1016] = 'ER_CANT_OPEN_FILE'; -exports[1017] = 'ER_FILE_NOT_FOUND'; -exports[1018] = 'ER_CANT_READ_DIR'; -exports[1019] = 'ER_CANT_SET_WD'; -exports[1020] = 'ER_CHECKREAD'; -exports[1021] = 'ER_DISK_FULL'; -exports[1022] = 'ER_DUP_KEY'; -exports[1023] = 'ER_ERROR_ON_CLOSE'; -exports[1024] = 'ER_ERROR_ON_READ'; -exports[1025] = 'ER_ERROR_ON_RENAME'; -exports[1026] = 'ER_ERROR_ON_WRITE'; -exports[1027] = 'ER_FILE_USED'; -exports[1028] = 'ER_FILSORT_ABORT'; -exports[1029] = 'ER_FORM_NOT_FOUND'; -exports[1030] = 'ER_GET_ERRNO'; -exports[1031] = 'ER_ILLEGAL_HA'; -exports[1032] = 'ER_KEY_NOT_FOUND'; -exports[1033] = 'ER_NOT_FORM_FILE'; -exports[1034] = 'ER_NOT_KEYFILE'; -exports[1035] = 'ER_OLD_KEYFILE'; -exports[1036] = 'ER_OPEN_AS_READONLY'; -exports[1037] = 'ER_OUTOFMEMORY'; -exports[1038] = 'ER_OUT_OF_SORTMEMORY'; -exports[1039] = 'ER_UNEXPECTED_EOF'; -exports[1040] = 'ER_CON_COUNT_ERROR'; -exports[1041] = 'ER_OUT_OF_RESOURCES'; -exports[1042] = 'ER_BAD_HOST_ERROR'; -exports[1043] = 'ER_HANDSHAKE_ERROR'; -exports[1044] = 'ER_DBACCESS_DENIED_ERROR'; -exports[1045] = 'ER_ACCESS_DENIED_ERROR'; -exports[1046] = 'ER_NO_DB_ERROR'; -exports[1047] = 'ER_UNKNOWN_COM_ERROR'; -exports[1048] = 'ER_BAD_NULL_ERROR'; -exports[1049] = 'ER_BAD_DB_ERROR'; -exports[1050] = 'ER_TABLE_EXISTS_ERROR'; -exports[1051] = 'ER_BAD_TABLE_ERROR'; -exports[1052] = 'ER_NON_UNIQ_ERROR'; -exports[1053] = 'ER_SERVER_SHUTDOWN'; -exports[1054] = 'ER_BAD_FIELD_ERROR'; -exports[1055] = 'ER_WRONG_FIELD_WITH_GROUP'; -exports[1056] = 'ER_WRONG_GROUP_FIELD'; -exports[1057] = 'ER_WRONG_SUM_SELECT'; -exports[1058] = 'ER_WRONG_VALUE_COUNT'; -exports[1059] = 'ER_TOO_LONG_IDENT'; -exports[1060] = 'ER_DUP_FIELDNAME'; -exports[1061] = 'ER_DUP_KEYNAME'; -exports[1062] = 'ER_DUP_ENTRY'; -exports[1063] = 'ER_WRONG_FIELD_SPEC'; -exports[1064] = 'ER_PARSE_ERROR'; -exports[1065] = 'ER_EMPTY_QUERY'; -exports[1066] = 'ER_NONUNIQ_TABLE'; -exports[1067] = 'ER_INVALID_DEFAULT'; -exports[1068] = 'ER_MULTIPLE_PRI_KEY'; -exports[1069] = 'ER_TOO_MANY_KEYS'; -exports[1070] = 'ER_TOO_MANY_KEY_PARTS'; -exports[1071] = 'ER_TOO_LONG_KEY'; -exports[1072] = 'ER_KEY_COLUMN_DOES_NOT_EXITS'; -exports[1073] = 'ER_BLOB_USED_AS_KEY'; -exports[1074] = 'ER_TOO_BIG_FIELDLENGTH'; -exports[1075] = 'ER_WRONG_AUTO_KEY'; -exports[1076] = 'ER_READY'; -exports[1077] = 'ER_NORMAL_SHUTDOWN'; -exports[1078] = 'ER_GOT_SIGNAL'; -exports[1079] = 'ER_SHUTDOWN_COMPLETE'; -exports[1080] = 'ER_FORCING_CLOSE'; -exports[1081] = 'ER_IPSOCK_ERROR'; -exports[1082] = 'ER_NO_SUCH_INDEX'; -exports[1083] = 'ER_WRONG_FIELD_TERMINATORS'; -exports[1084] = 'ER_BLOBS_AND_NO_TERMINATED'; -exports[1085] = 'ER_TEXTFILE_NOT_READABLE'; -exports[1086] = 'ER_FILE_EXISTS_ERROR'; -exports[1087] = 'ER_LOAD_INFO'; -exports[1088] = 'ER_ALTER_INFO'; -exports[1089] = 'ER_WRONG_SUB_KEY'; -exports[1090] = 'ER_CANT_REMOVE_ALL_FIELDS'; -exports[1091] = 'ER_CANT_DROP_FIELD_OR_KEY'; -exports[1092] = 'ER_INSERT_INFO'; -exports[1093] = 'ER_UPDATE_TABLE_USED'; -exports[1094] = 'ER_NO_SUCH_THREAD'; -exports[1095] = 'ER_KILL_DENIED_ERROR'; -exports[1096] = 'ER_NO_TABLES_USED'; -exports[1097] = 'ER_TOO_BIG_SET'; -exports[1098] = 'ER_NO_UNIQUE_LOGFILE'; -exports[1099] = 'ER_TABLE_NOT_LOCKED_FOR_WRITE'; -exports[1100] = 'ER_TABLE_NOT_LOCKED'; -exports[1101] = 'ER_BLOB_CANT_HAVE_DEFAULT'; -exports[1102] = 'ER_WRONG_DB_NAME'; -exports[1103] = 'ER_WRONG_TABLE_NAME'; -exports[1104] = 'ER_TOO_BIG_SELECT'; -exports[1105] = 'ER_UNKNOWN_ERROR'; -exports[1106] = 'ER_UNKNOWN_PROCEDURE'; -exports[1107] = 'ER_WRONG_PARAMCOUNT_TO_PROCEDURE'; -exports[1108] = 'ER_WRONG_PARAMETERS_TO_PROCEDURE'; -exports[1109] = 'ER_UNKNOWN_TABLE'; -exports[1110] = 'ER_FIELD_SPECIFIED_TWICE'; -exports[1111] = 'ER_INVALID_GROUP_FUNC_USE'; -exports[1112] = 'ER_UNSUPPORTED_EXTENSION'; -exports[1113] = 'ER_TABLE_MUST_HAVE_COLUMNS'; -exports[1114] = 'ER_RECORD_FILE_FULL'; -exports[1115] = 'ER_UNKNOWN_CHARACTER_SET'; -exports[1116] = 'ER_TOO_MANY_TABLES'; -exports[1117] = 'ER_TOO_MANY_FIELDS'; -exports[1118] = 'ER_TOO_BIG_ROWSIZE'; -exports[1119] = 'ER_STACK_OVERRUN'; -exports[1120] = 'ER_WRONG_OUTER_JOIN'; -exports[1121] = 'ER_NULL_COLUMN_IN_INDEX'; -exports[1122] = 'ER_CANT_FIND_UDF'; -exports[1123] = 'ER_CANT_INITIALIZE_UDF'; -exports[1124] = 'ER_UDF_NO_PATHS'; -exports[1125] = 'ER_UDF_EXISTS'; -exports[1126] = 'ER_CANT_OPEN_LIBRARY'; -exports[1127] = 'ER_CANT_FIND_DL_ENTRY'; -exports[1128] = 'ER_FUNCTION_NOT_DEFINED'; -exports[1129] = 'ER_HOST_IS_BLOCKED'; -exports[1130] = 'ER_HOST_NOT_PRIVILEGED'; -exports[1131] = 'ER_PASSWORD_ANONYMOUS_USER'; -exports[1132] = 'ER_PASSWORD_NOT_ALLOWED'; -exports[1133] = 'ER_PASSWORD_NO_MATCH'; -exports[1134] = 'ER_UPDATE_INFO'; -exports[1135] = 'ER_CANT_CREATE_THREAD'; -exports[1136] = 'ER_WRONG_VALUE_COUNT_ON_ROW'; -exports[1137] = 'ER_CANT_REOPEN_TABLE'; -exports[1138] = 'ER_INVALID_USE_OF_NULL'; -exports[1139] = 'ER_REGEXP_ERROR'; -exports[1140] = 'ER_MIX_OF_GROUP_FUNC_AND_FIELDS'; -exports[1141] = 'ER_NONEXISTING_GRANT'; -exports[1142] = 'ER_TABLEACCESS_DENIED_ERROR'; -exports[1143] = 'ER_COLUMNACCESS_DENIED_ERROR'; -exports[1144] = 'ER_ILLEGAL_GRANT_FOR_TABLE'; -exports[1145] = 'ER_GRANT_WRONG_HOST_OR_USER'; -exports[1146] = 'ER_NO_SUCH_TABLE'; -exports[1147] = 'ER_NONEXISTING_TABLE_GRANT'; -exports[1148] = 'ER_NOT_ALLOWED_COMMAND'; -exports[1149] = 'ER_SYNTAX_ERROR'; -exports[1150] = 'ER_DELAYED_CANT_CHANGE_LOCK'; -exports[1151] = 'ER_TOO_MANY_DELAYED_THREADS'; -exports[1152] = 'ER_ABORTING_CONNECTION'; -exports[1153] = 'ER_NET_PACKET_TOO_LARGE'; -exports[1154] = 'ER_NET_READ_ERROR_FROM_PIPE'; -exports[1155] = 'ER_NET_FCNTL_ERROR'; -exports[1156] = 'ER_NET_PACKETS_OUT_OF_ORDER'; -exports[1157] = 'ER_NET_UNCOMPRESS_ERROR'; -exports[1158] = 'ER_NET_READ_ERROR'; -exports[1159] = 'ER_NET_READ_INTERRUPTED'; -exports[1160] = 'ER_NET_ERROR_ON_WRITE'; -exports[1161] = 'ER_NET_WRITE_INTERRUPTED'; -exports[1162] = 'ER_TOO_LONG_STRING'; -exports[1163] = 'ER_TABLE_CANT_HANDLE_BLOB'; -exports[1164] = 'ER_TABLE_CANT_HANDLE_AUTO_INCREMENT'; -exports[1165] = 'ER_DELAYED_INSERT_TABLE_LOCKED'; -exports[1166] = 'ER_WRONG_COLUMN_NAME'; -exports[1167] = 'ER_WRONG_KEY_COLUMN'; -exports[1168] = 'ER_WRONG_MRG_TABLE'; -exports[1169] = 'ER_DUP_UNIQUE'; -exports[1170] = 'ER_BLOB_KEY_WITHOUT_LENGTH'; -exports[1171] = 'ER_PRIMARY_CANT_HAVE_NULL'; -exports[1172] = 'ER_TOO_MANY_ROWS'; -exports[1173] = 'ER_REQUIRES_PRIMARY_KEY'; -exports[1174] = 'ER_NO_RAID_COMPILED'; -exports[1175] = 'ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE'; -exports[1176] = 'ER_KEY_DOES_NOT_EXITS'; -exports[1177] = 'ER_CHECK_NO_SUCH_TABLE'; -exports[1178] = 'ER_CHECK_NOT_IMPLEMENTED'; -exports[1179] = 'ER_CANT_DO_THIS_DURING_AN_TRANSACTION'; -exports[1180] = 'ER_ERROR_DURING_COMMIT'; -exports[1181] = 'ER_ERROR_DURING_ROLLBACK'; -exports[1182] = 'ER_ERROR_DURING_FLUSH_LOGS'; -exports[1183] = 'ER_ERROR_DURING_CHECKPOINT'; -exports[1184] = 'ER_NEW_ABORTING_CONNECTION'; -exports[1185] = 'ER_DUMP_NOT_IMPLEMENTED'; -exports[1186] = 'ER_FLUSH_MASTER_BINLOG_CLOSED'; -exports[1187] = 'ER_INDEX_REBUILD'; -exports[1188] = 'ER_MASTER'; -exports[1189] = 'ER_MASTER_NET_READ'; -exports[1190] = 'ER_MASTER_NET_WRITE'; -exports[1191] = 'ER_FT_MATCHING_KEY_NOT_FOUND'; -exports[1192] = 'ER_LOCK_OR_ACTIVE_TRANSACTION'; -exports[1193] = 'ER_UNKNOWN_SYSTEM_VARIABLE'; -exports[1194] = 'ER_CRASHED_ON_USAGE'; -exports[1195] = 'ER_CRASHED_ON_REPAIR'; -exports[1196] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK'; -exports[1197] = 'ER_TRANS_CACHE_FULL'; -exports[1198] = 'ER_SLAVE_MUST_STOP'; -exports[1199] = 'ER_SLAVE_NOT_RUNNING'; -exports[1200] = 'ER_BAD_SLAVE'; -exports[1201] = 'ER_MASTER_INFO'; -exports[1202] = 'ER_SLAVE_THREAD'; -exports[1203] = 'ER_TOO_MANY_USER_CONNECTIONS'; -exports[1204] = 'ER_SET_CONSTANTS_ONLY'; -exports[1205] = 'ER_LOCK_WAIT_TIMEOUT'; -exports[1206] = 'ER_LOCK_TABLE_FULL'; -exports[1207] = 'ER_READ_ONLY_TRANSACTION'; -exports[1208] = 'ER_DROP_DB_WITH_READ_LOCK'; -exports[1209] = 'ER_CREATE_DB_WITH_READ_LOCK'; -exports[1210] = 'ER_WRONG_ARGUMENTS'; -exports[1211] = 'ER_NO_PERMISSION_TO_CREATE_USER'; -exports[1212] = 'ER_UNION_TABLES_IN_DIFFERENT_DIR'; -exports[1213] = 'ER_LOCK_DEADLOCK'; -exports[1214] = 'ER_TABLE_CANT_HANDLE_FT'; -exports[1215] = 'ER_CANNOT_ADD_FOREIGN'; -exports[1216] = 'ER_NO_REFERENCED_ROW'; -exports[1217] = 'ER_ROW_IS_REFERENCED'; -exports[1218] = 'ER_CONNECT_TO_MASTER'; -exports[1219] = 'ER_QUERY_ON_MASTER'; -exports[1220] = 'ER_ERROR_WHEN_EXECUTING_COMMAND'; -exports[1221] = 'ER_WRONG_USAGE'; -exports[1222] = 'ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT'; -exports[1223] = 'ER_CANT_UPDATE_WITH_READLOCK'; -exports[1224] = 'ER_MIXING_NOT_ALLOWED'; -exports[1225] = 'ER_DUP_ARGUMENT'; -exports[1226] = 'ER_USER_LIMIT_REACHED'; -exports[1227] = 'ER_SPECIFIC_ACCESS_DENIED_ERROR'; -exports[1228] = 'ER_LOCAL_VARIABLE'; -exports[1229] = 'ER_GLOBAL_VARIABLE'; -exports[1230] = 'ER_NO_DEFAULT'; -exports[1231] = 'ER_WRONG_VALUE_FOR_VAR'; -exports[1232] = 'ER_WRONG_TYPE_FOR_VAR'; -exports[1233] = 'ER_VAR_CANT_BE_READ'; -exports[1234] = 'ER_CANT_USE_OPTION_HERE'; -exports[1235] = 'ER_NOT_SUPPORTED_YET'; -exports[1236] = 'ER_MASTER_FATAL_ERROR_READING_BINLOG'; -exports[1237] = 'ER_SLAVE_IGNORED_TABLE'; -exports[1238] = 'ER_INCORRECT_GLOBAL_LOCAL_VAR'; -exports[1239] = 'ER_WRONG_FK_DEF'; -exports[1240] = 'ER_KEY_REF_DO_NOT_MATCH_TABLE_REF'; -exports[1241] = 'ER_OPERAND_COLUMNS'; -exports[1242] = 'ER_SUBQUERY_NO_1_ROW'; -exports[1243] = 'ER_UNKNOWN_STMT_HANDLER'; -exports[1244] = 'ER_CORRUPT_HELP_DB'; -exports[1245] = 'ER_CYCLIC_REFERENCE'; -exports[1246] = 'ER_AUTO_CONVERT'; -exports[1247] = 'ER_ILLEGAL_REFERENCE'; -exports[1248] = 'ER_DERIVED_MUST_HAVE_ALIAS'; -exports[1249] = 'ER_SELECT_REDUCED'; -exports[1250] = 'ER_TABLENAME_NOT_ALLOWED_HERE'; -exports[1251] = 'ER_NOT_SUPPORTED_AUTH_MODE'; -exports[1252] = 'ER_SPATIAL_CANT_HAVE_NULL'; -exports[1253] = 'ER_COLLATION_CHARSET_MISMATCH'; -exports[1254] = 'ER_SLAVE_WAS_RUNNING'; -exports[1255] = 'ER_SLAVE_WAS_NOT_RUNNING'; -exports[1256] = 'ER_TOO_BIG_FOR_UNCOMPRESS'; -exports[1257] = 'ER_ZLIB_Z_MEM_ERROR'; -exports[1258] = 'ER_ZLIB_Z_BUF_ERROR'; -exports[1259] = 'ER_ZLIB_Z_DATA_ERROR'; -exports[1260] = 'ER_CUT_VALUE_GROUP_CONCAT'; -exports[1261] = 'ER_WARN_TOO_FEW_RECORDS'; -exports[1262] = 'ER_WARN_TOO_MANY_RECORDS'; -exports[1263] = 'ER_WARN_NULL_TO_NOTNULL'; -exports[1264] = 'ER_WARN_DATA_OUT_OF_RANGE'; -exports[1265] = 'WARN_DATA_TRUNCATED'; -exports[1266] = 'ER_WARN_USING_OTHER_HANDLER'; -exports[1267] = 'ER_CANT_AGGREGATE_2COLLATIONS'; -exports[1268] = 'ER_DROP_USER'; -exports[1269] = 'ER_REVOKE_GRANTS'; -exports[1270] = 'ER_CANT_AGGREGATE_3COLLATIONS'; -exports[1271] = 'ER_CANT_AGGREGATE_NCOLLATIONS'; -exports[1272] = 'ER_VARIABLE_IS_NOT_STRUCT'; -exports[1273] = 'ER_UNKNOWN_COLLATION'; -exports[1274] = 'ER_SLAVE_IGNORED_SSL_PARAMS'; -exports[1275] = 'ER_SERVER_IS_IN_SECURE_AUTH_MODE'; -exports[1276] = 'ER_WARN_FIELD_RESOLVED'; -exports[1277] = 'ER_BAD_SLAVE_UNTIL_COND'; -exports[1278] = 'ER_MISSING_SKIP_SLAVE'; -exports[1279] = 'ER_UNTIL_COND_IGNORED'; -exports[1280] = 'ER_WRONG_NAME_FOR_INDEX'; -exports[1281] = 'ER_WRONG_NAME_FOR_CATALOG'; -exports[1282] = 'ER_WARN_QC_RESIZE'; -exports[1283] = 'ER_BAD_FT_COLUMN'; -exports[1284] = 'ER_UNKNOWN_KEY_CACHE'; -exports[1285] = 'ER_WARN_HOSTNAME_WONT_WORK'; -exports[1286] = 'ER_UNKNOWN_STORAGE_ENGINE'; -exports[1287] = 'ER_WARN_DEPRECATED_SYNTAX'; -exports[1288] = 'ER_NON_UPDATABLE_TABLE'; -exports[1289] = 'ER_FEATURE_DISABLED'; -exports[1290] = 'ER_OPTION_PREVENTS_STATEMENT'; -exports[1291] = 'ER_DUPLICATED_VALUE_IN_TYPE'; -exports[1292] = 'ER_TRUNCATED_WRONG_VALUE'; -exports[1293] = 'ER_TOO_MUCH_AUTO_TIMESTAMP_COLS'; -exports[1294] = 'ER_INVALID_ON_UPDATE'; -exports[1295] = 'ER_UNSUPPORTED_PS'; -exports[1296] = 'ER_GET_ERRMSG'; -exports[1297] = 'ER_GET_TEMPORARY_ERRMSG'; -exports[1298] = 'ER_UNKNOWN_TIME_ZONE'; -exports[1299] = 'ER_WARN_INVALID_TIMESTAMP'; -exports[1300] = 'ER_INVALID_CHARACTER_STRING'; -exports[1301] = 'ER_WARN_ALLOWED_PACKET_OVERFLOWED'; -exports[1302] = 'ER_CONFLICTING_DECLARATIONS'; -exports[1303] = 'ER_SP_NO_RECURSIVE_CREATE'; -exports[1304] = 'ER_SP_ALREADY_EXISTS'; -exports[1305] = 'ER_SP_DOES_NOT_EXIST'; -exports[1306] = 'ER_SP_DROP_FAILED'; -exports[1307] = 'ER_SP_STORE_FAILED'; -exports[1308] = 'ER_SP_LILABEL_MISMATCH'; -exports[1309] = 'ER_SP_LABEL_REDEFINE'; -exports[1310] = 'ER_SP_LABEL_MISMATCH'; -exports[1311] = 'ER_SP_UNINIT_VAR'; -exports[1312] = 'ER_SP_BADSELECT'; -exports[1313] = 'ER_SP_BADRETURN'; -exports[1314] = 'ER_SP_BADSTATEMENT'; -exports[1315] = 'ER_UPDATE_LOG_DEPRECATED_IGNORED'; -exports[1316] = 'ER_UPDATE_LOG_DEPRECATED_TRANSLATED'; -exports[1317] = 'ER_QUERY_INTERRUPTED'; -exports[1318] = 'ER_SP_WRONG_NO_OF_ARGS'; -exports[1319] = 'ER_SP_COND_MISMATCH'; -exports[1320] = 'ER_SP_NORETURN'; -exports[1321] = 'ER_SP_NORETURNEND'; -exports[1322] = 'ER_SP_BAD_CURSOR_QUERY'; -exports[1323] = 'ER_SP_BAD_CURSOR_SELECT'; -exports[1324] = 'ER_SP_CURSOR_MISMATCH'; -exports[1325] = 'ER_SP_CURSOR_ALREADY_OPEN'; -exports[1326] = 'ER_SP_CURSOR_NOT_OPEN'; -exports[1327] = 'ER_SP_UNDECLARED_VAR'; -exports[1328] = 'ER_SP_WRONG_NO_OF_FETCH_ARGS'; -exports[1329] = 'ER_SP_FETCH_NO_DATA'; -exports[1330] = 'ER_SP_DUP_PARAM'; -exports[1331] = 'ER_SP_DUP_VAR'; -exports[1332] = 'ER_SP_DUP_COND'; -exports[1333] = 'ER_SP_DUP_CURS'; -exports[1334] = 'ER_SP_CANT_ALTER'; -exports[1335] = 'ER_SP_SUBSELECT_NYI'; -exports[1336] = 'ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG'; -exports[1337] = 'ER_SP_VARCOND_AFTER_CURSHNDLR'; -exports[1338] = 'ER_SP_CURSOR_AFTER_HANDLER'; -exports[1339] = 'ER_SP_CASE_NOT_FOUND'; -exports[1340] = 'ER_FPARSER_TOO_BIG_FILE'; -exports[1341] = 'ER_FPARSER_BAD_HEADER'; -exports[1342] = 'ER_FPARSER_EOF_IN_COMMENT'; -exports[1343] = 'ER_FPARSER_ERROR_IN_PARAMETER'; -exports[1344] = 'ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER'; -exports[1345] = 'ER_VIEW_NO_EXPLAIN'; -exports[1346] = 'ER_FRM_UNKNOWN_TYPE'; -exports[1347] = 'ER_WRONG_OBJECT'; -exports[1348] = 'ER_NONUPDATEABLE_COLUMN'; -exports[1349] = 'ER_VIEW_SELECT_DERIVED'; -exports[1350] = 'ER_VIEW_SELECT_CLAUSE'; -exports[1351] = 'ER_VIEW_SELECT_VARIABLE'; -exports[1352] = 'ER_VIEW_SELECT_TMPTABLE'; -exports[1353] = 'ER_VIEW_WRONG_LIST'; -exports[1354] = 'ER_WARN_VIEW_MERGE'; -exports[1355] = 'ER_WARN_VIEW_WITHOUT_KEY'; -exports[1356] = 'ER_VIEW_INVALID'; -exports[1357] = 'ER_SP_NO_DROP_SP'; -exports[1358] = 'ER_SP_GOTO_IN_HNDLR'; -exports[1359] = 'ER_TRG_ALREADY_EXISTS'; -exports[1360] = 'ER_TRG_DOES_NOT_EXIST'; -exports[1361] = 'ER_TRG_ON_VIEW_OR_TEMP_TABLE'; -exports[1362] = 'ER_TRG_CANT_CHANGE_ROW'; -exports[1363] = 'ER_TRG_NO_SUCH_ROW_IN_TRG'; -exports[1364] = 'ER_NO_DEFAULT_FOR_FIELD'; -exports[1365] = 'ER_DIVISION_BY_ZERO'; -exports[1366] = 'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD'; -exports[1367] = 'ER_ILLEGAL_VALUE_FOR_TYPE'; -exports[1368] = 'ER_VIEW_NONUPD_CHECK'; -exports[1369] = 'ER_VIEW_CHECK_FAILED'; -exports[1370] = 'ER_PROCACCESS_DENIED_ERROR'; -exports[1371] = 'ER_RELAY_LOG_FAIL'; -exports[1372] = 'ER_PASSWD_LENGTH'; -exports[1373] = 'ER_UNKNOWN_TARGET_BINLOG'; -exports[1374] = 'ER_IO_ERR_LOG_INDEX_READ'; -exports[1375] = 'ER_BINLOG_PURGE_PROHIBITED'; -exports[1376] = 'ER_FSEEK_FAIL'; -exports[1377] = 'ER_BINLOG_PURGE_FATAL_ERR'; -exports[1378] = 'ER_LOG_IN_USE'; -exports[1379] = 'ER_LOG_PURGE_UNKNOWN_ERR'; -exports[1380] = 'ER_RELAY_LOG_INIT'; -exports[1381] = 'ER_NO_BINARY_LOGGING'; -exports[1382] = 'ER_RESERVED_SYNTAX'; -exports[1383] = 'ER_WSAS_FAILED'; -exports[1384] = 'ER_DIFF_GROUPS_PROC'; -exports[1385] = 'ER_NO_GROUP_FOR_PROC'; -exports[1386] = 'ER_ORDER_WITH_PROC'; -exports[1387] = 'ER_LOGGING_PROHIBIT_CHANGING_OF'; -exports[1388] = 'ER_NO_FILE_MAPPING'; -exports[1389] = 'ER_WRONG_MAGIC'; -exports[1390] = 'ER_PS_MANY_PARAM'; -exports[1391] = 'ER_KEY_PART_0'; -exports[1392] = 'ER_VIEW_CHECKSUM'; -exports[1393] = 'ER_VIEW_MULTIUPDATE'; -exports[1394] = 'ER_VIEW_NO_INSERT_FIELD_LIST'; -exports[1395] = 'ER_VIEW_DELETE_MERGE_VIEW'; -exports[1396] = 'ER_CANNOT_USER'; -exports[1397] = 'ER_XAER_NOTA'; -exports[1398] = 'ER_XAER_INVAL'; -exports[1399] = 'ER_XAER_RMFAIL'; -exports[1400] = 'ER_XAER_OUTSIDE'; -exports[1401] = 'ER_XAER_RMERR'; -exports[1402] = 'ER_XA_RBROLLBACK'; -exports[1403] = 'ER_NONEXISTING_PROC_GRANT'; -exports[1404] = 'ER_PROC_AUTO_GRANT_FAIL'; -exports[1405] = 'ER_PROC_AUTO_REVOKE_FAIL'; -exports[1406] = 'ER_DATA_TOO_LONG'; -exports[1407] = 'ER_SP_BAD_SQLSTATE'; -exports[1408] = 'ER_STARTUP'; -exports[1409] = 'ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR'; -exports[1410] = 'ER_CANT_CREATE_USER_WITH_GRANT'; -exports[1411] = 'ER_WRONG_VALUE_FOR_TYPE'; -exports[1412] = 'ER_TABLE_DEF_CHANGED'; -exports[1413] = 'ER_SP_DUP_HANDLER'; -exports[1414] = 'ER_SP_NOT_VAR_ARG'; -exports[1415] = 'ER_SP_NO_RETSET'; -exports[1416] = 'ER_CANT_CREATE_GEOMETRY_OBJECT'; -exports[1417] = 'ER_FAILED_ROUTINE_BREAK_BINLOG'; -exports[1418] = 'ER_BINLOG_UNSAFE_ROUTINE'; -exports[1419] = 'ER_BINLOG_CREATE_ROUTINE_NEED_SUPER'; -exports[1420] = 'ER_EXEC_STMT_WITH_OPEN_CURSOR'; -exports[1421] = 'ER_STMT_HAS_NO_OPEN_CURSOR'; -exports[1422] = 'ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG'; -exports[1423] = 'ER_NO_DEFAULT_FOR_VIEW_FIELD'; -exports[1424] = 'ER_SP_NO_RECURSION'; -exports[1425] = 'ER_TOO_BIG_SCALE'; -exports[1426] = 'ER_TOO_BIG_PRECISION'; -exports[1427] = 'ER_M_BIGGER_THAN_D'; -exports[1428] = 'ER_WRONG_LOCK_OF_SYSTEM_TABLE'; -exports[1429] = 'ER_CONNECT_TO_FOREIGN_DATA_SOURCE'; -exports[1430] = 'ER_QUERY_ON_FOREIGN_DATA_SOURCE'; -exports[1431] = 'ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST'; -exports[1432] = 'ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE'; -exports[1433] = 'ER_FOREIGN_DATA_STRING_INVALID'; -exports[1434] = 'ER_CANT_CREATE_FEDERATED_TABLE'; -exports[1435] = 'ER_TRG_IN_WRONG_SCHEMA'; -exports[1436] = 'ER_STACK_OVERRUN_NEED_MORE'; -exports[1437] = 'ER_TOO_LONG_BODY'; -exports[1438] = 'ER_WARN_CANT_DROP_DEFAULT_KEYCACHE'; -exports[1439] = 'ER_TOO_BIG_DISPLAYWIDTH'; -exports[1440] = 'ER_XAER_DUPID'; -exports[1441] = 'ER_DATETIME_FUNCTION_OVERFLOW'; -exports[1442] = 'ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG'; -exports[1443] = 'ER_VIEW_PREVENT_UPDATE'; -exports[1444] = 'ER_PS_NO_RECURSION'; -exports[1445] = 'ER_SP_CANT_SET_AUTOCOMMIT'; -exports[1446] = 'ER_MALFORMED_DEFINER'; -exports[1447] = 'ER_VIEW_FRM_NO_USER'; -exports[1448] = 'ER_VIEW_OTHER_USER'; -exports[1449] = 'ER_NO_SUCH_USER'; -exports[1450] = 'ER_FORBID_SCHEMA_CHANGE'; -exports[1451] = 'ER_ROW_IS_REFERENCED_2'; -exports[1452] = 'ER_NO_REFERENCED_ROW_2'; -exports[1453] = 'ER_SP_BAD_VAR_SHADOW'; -exports[1454] = 'ER_TRG_NO_DEFINER'; -exports[1455] = 'ER_OLD_FILE_FORMAT'; -exports[1456] = 'ER_SP_RECURSION_LIMIT'; -exports[1457] = 'ER_SP_PROC_TABLE_CORRUPT'; -exports[1458] = 'ER_SP_WRONG_NAME'; -exports[1459] = 'ER_TABLE_NEEDS_UPGRADE'; -exports[1460] = 'ER_SP_NO_AGGREGATE'; -exports[1461] = 'ER_MAX_PREPARED_STMT_COUNT_REACHED'; -exports[1462] = 'ER_VIEW_RECURSIVE'; -exports[1463] = 'ER_NON_GROUPING_FIELD_USED'; -exports[1464] = 'ER_TABLE_CANT_HANDLE_SPKEYS'; -exports[1465] = 'ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA'; -exports[1466] = 'ER_REMOVED_SPACES'; -exports[1467] = 'ER_AUTOINC_READ_FAILED'; -exports[1468] = 'ER_USERNAME'; -exports[1469] = 'ER_HOSTNAME'; -exports[1470] = 'ER_WRONG_STRING_LENGTH'; -exports[1471] = 'ER_NON_INSERTABLE_TABLE'; -exports[1472] = 'ER_ADMIN_WRONG_MRG_TABLE'; -exports[1473] = 'ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT'; -exports[1474] = 'ER_NAME_BECOMES_EMPTY'; -exports[1475] = 'ER_AMBIGUOUS_FIELD_TERM'; -exports[1476] = 'ER_FOREIGN_SERVER_EXISTS'; -exports[1477] = 'ER_FOREIGN_SERVER_DOESNT_EXIST'; -exports[1478] = 'ER_ILLEGAL_HA_CREATE_OPTION'; -exports[1479] = 'ER_PARTITION_REQUIRES_VALUES_ERROR'; -exports[1480] = 'ER_PARTITION_WRONG_VALUES_ERROR'; -exports[1481] = 'ER_PARTITION_MAXVALUE_ERROR'; -exports[1482] = 'ER_PARTITION_SUBPARTITION_ERROR'; -exports[1483] = 'ER_PARTITION_SUBPART_MIX_ERROR'; -exports[1484] = 'ER_PARTITION_WRONG_NO_PART_ERROR'; -exports[1485] = 'ER_PARTITION_WRONG_NO_SUBPART_ERROR'; -exports[1486] = 'ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR'; -exports[1487] = 'ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR'; -exports[1488] = 'ER_FIELD_NOT_FOUND_PART_ERROR'; -exports[1489] = 'ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR'; -exports[1490] = 'ER_INCONSISTENT_PARTITION_INFO_ERROR'; -exports[1491] = 'ER_PARTITION_FUNC_NOT_ALLOWED_ERROR'; -exports[1492] = 'ER_PARTITIONS_MUST_BE_DEFINED_ERROR'; -exports[1493] = 'ER_RANGE_NOT_INCREASING_ERROR'; -exports[1494] = 'ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR'; -exports[1495] = 'ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR'; -exports[1496] = 'ER_PARTITION_ENTRY_ERROR'; -exports[1497] = 'ER_MIX_HANDLER_ERROR'; -exports[1498] = 'ER_PARTITION_NOT_DEFINED_ERROR'; -exports[1499] = 'ER_TOO_MANY_PARTITIONS_ERROR'; -exports[1500] = 'ER_SUBPARTITION_ERROR'; -exports[1501] = 'ER_CANT_CREATE_HANDLER_FILE'; -exports[1502] = 'ER_BLOB_FIELD_IN_PART_FUNC_ERROR'; -exports[1503] = 'ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF'; -exports[1504] = 'ER_NO_PARTS_ERROR'; -exports[1505] = 'ER_PARTITION_MGMT_ON_NONPARTITIONED'; -exports[1506] = 'ER_FOREIGN_KEY_ON_PARTITIONED'; -exports[1507] = 'ER_DROP_PARTITION_NON_EXISTENT'; -exports[1508] = 'ER_DROP_LAST_PARTITION'; -exports[1509] = 'ER_COALESCE_ONLY_ON_HASH_PARTITION'; -exports[1510] = 'ER_REORG_HASH_ONLY_ON_SAME_NO'; -exports[1511] = 'ER_REORG_NO_PARAM_ERROR'; -exports[1512] = 'ER_ONLY_ON_RANGE_LIST_PARTITION'; -exports[1513] = 'ER_ADD_PARTITION_SUBPART_ERROR'; -exports[1514] = 'ER_ADD_PARTITION_NO_NEW_PARTITION'; -exports[1515] = 'ER_COALESCE_PARTITION_NO_PARTITION'; -exports[1516] = 'ER_REORG_PARTITION_NOT_EXIST'; -exports[1517] = 'ER_SAME_NAME_PARTITION'; -exports[1518] = 'ER_NO_BINLOG_ERROR'; -exports[1519] = 'ER_CONSECUTIVE_REORG_PARTITIONS'; -exports[1520] = 'ER_REORG_OUTSIDE_RANGE'; -exports[1521] = 'ER_PARTITION_FUNCTION_FAILURE'; -exports[1522] = 'ER_PART_STATE_ERROR'; -exports[1523] = 'ER_LIMITED_PART_RANGE'; -exports[1524] = 'ER_PLUGIN_IS_NOT_LOADED'; -exports[1525] = 'ER_WRONG_VALUE'; -exports[1526] = 'ER_NO_PARTITION_FOR_GIVEN_VALUE'; -exports[1527] = 'ER_FILEGROUP_OPTION_ONLY_ONCE'; -exports[1528] = 'ER_CREATE_FILEGROUP_FAILED'; -exports[1529] = 'ER_DROP_FILEGROUP_FAILED'; -exports[1530] = 'ER_TABLESPACE_AUTO_EXTEND_ERROR'; -exports[1531] = 'ER_WRONG_SIZE_NUMBER'; -exports[1532] = 'ER_SIZE_OVERFLOW_ERROR'; -exports[1533] = 'ER_ALTER_FILEGROUP_FAILED'; -exports[1534] = 'ER_BINLOG_ROW_LOGGING_FAILED'; -exports[1535] = 'ER_BINLOG_ROW_WRONG_TABLE_DEF'; -exports[1536] = 'ER_BINLOG_ROW_RBR_TO_SBR'; -exports[1537] = 'ER_EVENT_ALREADY_EXISTS'; -exports[1538] = 'ER_EVENT_STORE_FAILED'; -exports[1539] = 'ER_EVENT_DOES_NOT_EXIST'; -exports[1540] = 'ER_EVENT_CANT_ALTER'; -exports[1541] = 'ER_EVENT_DROP_FAILED'; -exports[1542] = 'ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG'; -exports[1543] = 'ER_EVENT_ENDS_BEFORE_STARTS'; -exports[1544] = 'ER_EVENT_EXEC_TIME_IN_THE_PAST'; -exports[1545] = 'ER_EVENT_OPEN_TABLE_FAILED'; -exports[1546] = 'ER_EVENT_NEITHER_M_EXPR_NOR_M_AT'; -exports[1547] = 'ER_COL_COUNT_DOESNT_MATCH_CORRUPTED'; -exports[1548] = 'ER_CANNOT_LOAD_FROM_TABLE'; -exports[1549] = 'ER_EVENT_CANNOT_DELETE'; -exports[1550] = 'ER_EVENT_COMPILE_ERROR'; -exports[1551] = 'ER_EVENT_SAME_NAME'; -exports[1552] = 'ER_EVENT_DATA_TOO_LONG'; -exports[1553] = 'ER_DROP_INDEX_FK'; -exports[1554] = 'ER_WARN_DEPRECATED_SYNTAX_WITH_VER'; -exports[1555] = 'ER_CANT_WRITE_LOCK_LOG_TABLE'; -exports[1556] = 'ER_CANT_LOCK_LOG_TABLE'; -exports[1557] = 'ER_FOREIGN_DUPLICATE_KEY'; -exports[1558] = 'ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE'; -exports[1559] = 'ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR'; -exports[1560] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT'; -exports[1561] = 'ER_NDB_CANT_SWITCH_BINLOG_FORMAT'; -exports[1562] = 'ER_PARTITION_NO_TEMPORARY'; -exports[1563] = 'ER_PARTITION_CONST_DOMAIN_ERROR'; -exports[1564] = 'ER_PARTITION_FUNCTION_IS_NOT_ALLOWED'; -exports[1565] = 'ER_DDL_LOG_ERROR'; -exports[1566] = 'ER_NULL_IN_VALUES_LESS_THAN'; -exports[1567] = 'ER_WRONG_PARTITION_NAME'; -exports[1568] = 'ER_CANT_CHANGE_TX_CHARACTERISTICS'; -exports[1569] = 'ER_DUP_ENTRY_AUTOINCREMENT_CASE'; -exports[1570] = 'ER_EVENT_MODIFY_QUEUE_ERROR'; -exports[1571] = 'ER_EVENT_SET_VAR_ERROR'; -exports[1572] = 'ER_PARTITION_MERGE_ERROR'; -exports[1573] = 'ER_CANT_ACTIVATE_LOG'; -exports[1574] = 'ER_RBR_NOT_AVAILABLE'; -exports[1575] = 'ER_BASE64_DECODE_ERROR'; -exports[1576] = 'ER_EVENT_RECURSION_FORBIDDEN'; -exports[1577] = 'ER_EVENTS_DB_ERROR'; -exports[1578] = 'ER_ONLY_INTEGERS_ALLOWED'; -exports[1579] = 'ER_UNSUPORTED_LOG_ENGINE'; -exports[1580] = 'ER_BAD_LOG_STATEMENT'; -exports[1581] = 'ER_CANT_RENAME_LOG_TABLE'; -exports[1582] = 'ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT'; -exports[1583] = 'ER_WRONG_PARAMETERS_TO_NATIVE_FCT'; -exports[1584] = 'ER_WRONG_PARAMETERS_TO_STORED_FCT'; -exports[1585] = 'ER_NATIVE_FCT_NAME_COLLISION'; -exports[1586] = 'ER_DUP_ENTRY_WITH_KEY_NAME'; -exports[1587] = 'ER_BINLOG_PURGE_EMFILE'; -exports[1588] = 'ER_EVENT_CANNOT_CREATE_IN_THE_PAST'; -exports[1589] = 'ER_EVENT_CANNOT_ALTER_IN_THE_PAST'; -exports[1590] = 'ER_SLAVE_INCIDENT'; -exports[1591] = 'ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT'; -exports[1592] = 'ER_BINLOG_UNSAFE_STATEMENT'; -exports[1593] = 'ER_SLAVE_FATAL_ERROR'; -exports[1594] = 'ER_SLAVE_RELAY_LOG_READ_FAILURE'; -exports[1595] = 'ER_SLAVE_RELAY_LOG_WRITE_FAILURE'; -exports[1596] = 'ER_SLAVE_CREATE_EVENT_FAILURE'; -exports[1597] = 'ER_SLAVE_MASTER_COM_FAILURE'; -exports[1598] = 'ER_BINLOG_LOGGING_IMPOSSIBLE'; -exports[1599] = 'ER_VIEW_NO_CREATION_CTX'; -exports[1600] = 'ER_VIEW_INVALID_CREATION_CTX'; -exports[1601] = 'ER_SR_INVALID_CREATION_CTX'; -exports[1602] = 'ER_TRG_CORRUPTED_FILE'; -exports[1603] = 'ER_TRG_NO_CREATION_CTX'; -exports[1604] = 'ER_TRG_INVALID_CREATION_CTX'; -exports[1605] = 'ER_EVENT_INVALID_CREATION_CTX'; -exports[1606] = 'ER_TRG_CANT_OPEN_TABLE'; -exports[1607] = 'ER_CANT_CREATE_SROUTINE'; -exports[1608] = 'ER_NEVER_USED'; -exports[1609] = 'ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT'; -exports[1610] = 'ER_SLAVE_CORRUPT_EVENT'; -exports[1611] = 'ER_LOAD_DATA_INVALID_COLUMN'; -exports[1612] = 'ER_LOG_PURGE_NO_FILE'; -exports[1613] = 'ER_XA_RBTIMEOUT'; -exports[1614] = 'ER_XA_RBDEADLOCK'; -exports[1615] = 'ER_NEED_REPREPARE'; -exports[1616] = 'ER_DELAYED_NOT_SUPPORTED'; -exports[1617] = 'WARN_NO_MASTER_INFO'; -exports[1618] = 'WARN_OPTION_IGNORED'; -exports[1619] = 'ER_PLUGIN_DELETE_BUILTIN'; -exports[1620] = 'WARN_PLUGIN_BUSY'; -exports[1621] = 'ER_VARIABLE_IS_READONLY'; -exports[1622] = 'ER_WARN_ENGINE_TRANSACTION_ROLLBACK'; -exports[1623] = 'ER_SLAVE_HEARTBEAT_FAILURE'; -exports[1624] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE'; -exports[1625] = 'ER_NDB_REPLICATION_SCHEMA_ERROR'; -exports[1626] = 'ER_CONFLICT_FN_PARSE_ERROR'; -exports[1627] = 'ER_EXCEPTIONS_WRITE_ERROR'; -exports[1628] = 'ER_TOO_LONG_TABLE_COMMENT'; -exports[1629] = 'ER_TOO_LONG_FIELD_COMMENT'; -exports[1630] = 'ER_FUNC_INEXISTENT_NAME_COLLISION'; -exports[1631] = 'ER_DATABASE_NAME'; -exports[1632] = 'ER_TABLE_NAME'; -exports[1633] = 'ER_PARTITION_NAME'; -exports[1634] = 'ER_SUBPARTITION_NAME'; -exports[1635] = 'ER_TEMPORARY_NAME'; -exports[1636] = 'ER_RENAMED_NAME'; -exports[1637] = 'ER_TOO_MANY_CONCURRENT_TRXS'; -exports[1638] = 'WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED'; -exports[1639] = 'ER_DEBUG_SYNC_TIMEOUT'; -exports[1640] = 'ER_DEBUG_SYNC_HIT_LIMIT'; -exports[1641] = 'ER_DUP_SIGNAL_SET'; -exports[1642] = 'ER_SIGNAL_WARN'; -exports[1643] = 'ER_SIGNAL_NOT_FOUND'; -exports[1644] = 'ER_SIGNAL_EXCEPTION'; -exports[1645] = 'ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER'; -exports[1646] = 'ER_SIGNAL_BAD_CONDITION_TYPE'; -exports[1647] = 'WARN_COND_ITEM_TRUNCATED'; -exports[1648] = 'ER_COND_ITEM_TOO_LONG'; -exports[1649] = 'ER_UNKNOWN_LOCALE'; -exports[1650] = 'ER_SLAVE_IGNORE_SERVER_IDS'; -exports[1651] = 'ER_QUERY_CACHE_DISABLED'; -exports[1652] = 'ER_SAME_NAME_PARTITION_FIELD'; -exports[1653] = 'ER_PARTITION_COLUMN_LIST_ERROR'; -exports[1654] = 'ER_WRONG_TYPE_COLUMN_VALUE_ERROR'; -exports[1655] = 'ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR'; -exports[1656] = 'ER_MAXVALUE_IN_VALUES_IN'; -exports[1657] = 'ER_TOO_MANY_VALUES_ERROR'; -exports[1658] = 'ER_ROW_SINGLE_PARTITION_FIELD_ERROR'; -exports[1659] = 'ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD'; -exports[1660] = 'ER_PARTITION_FIELDS_TOO_LONG'; -exports[1661] = 'ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE'; -exports[1662] = 'ER_BINLOG_ROW_MODE_AND_STMT_ENGINE'; -exports[1663] = 'ER_BINLOG_UNSAFE_AND_STMT_ENGINE'; -exports[1664] = 'ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE'; -exports[1665] = 'ER_BINLOG_STMT_MODE_AND_ROW_ENGINE'; -exports[1666] = 'ER_BINLOG_ROW_INJECTION_AND_STMT_MODE'; -exports[1667] = 'ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE'; -exports[1668] = 'ER_BINLOG_UNSAFE_LIMIT'; -exports[1669] = 'ER_BINLOG_UNSAFE_INSERT_DELAYED'; -exports[1670] = 'ER_BINLOG_UNSAFE_SYSTEM_TABLE'; -exports[1671] = 'ER_BINLOG_UNSAFE_AUTOINC_COLUMNS'; -exports[1672] = 'ER_BINLOG_UNSAFE_UDF'; -exports[1673] = 'ER_BINLOG_UNSAFE_SYSTEM_VARIABLE'; -exports[1674] = 'ER_BINLOG_UNSAFE_SYSTEM_FUNCTION'; -exports[1675] = 'ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS'; -exports[1676] = 'ER_MESSAGE_AND_STATEMENT'; -exports[1677] = 'ER_SLAVE_CONVERSION_FAILED'; -exports[1678] = 'ER_SLAVE_CANT_CREATE_CONVERSION'; -exports[1679] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT'; -exports[1680] = 'ER_PATH_LENGTH'; -exports[1681] = 'ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT'; -exports[1682] = 'ER_WRONG_NATIVE_TABLE_STRUCTURE'; -exports[1683] = 'ER_WRONG_PERFSCHEMA_USAGE'; -exports[1684] = 'ER_WARN_I_S_SKIPPED_TABLE'; -exports[1685] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT'; -exports[1686] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT'; -exports[1687] = 'ER_SPATIAL_MUST_HAVE_GEOM_COL'; -exports[1688] = 'ER_TOO_LONG_INDEX_COMMENT'; -exports[1689] = 'ER_LOCK_ABORTED'; -exports[1690] = 'ER_DATA_OUT_OF_RANGE'; -exports[1691] = 'ER_WRONG_SPVAR_TYPE_IN_LIMIT'; -exports[1692] = 'ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE'; -exports[1693] = 'ER_BINLOG_UNSAFE_MIXED_STATEMENT'; -exports[1694] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN'; -exports[1695] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN'; -exports[1696] = 'ER_FAILED_READ_FROM_PAR_FILE'; -exports[1697] = 'ER_VALUES_IS_NOT_INT_TYPE_ERROR'; -exports[1698] = 'ER_ACCESS_DENIED_NO_PASSWORD_ERROR'; -exports[1699] = 'ER_SET_PASSWORD_AUTH_PLUGIN'; -exports[1700] = 'ER_GRANT_PLUGIN_USER_EXISTS'; -exports[1701] = 'ER_TRUNCATE_ILLEGAL_FK'; -exports[1702] = 'ER_PLUGIN_IS_PERMANENT'; -exports[1703] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN'; -exports[1704] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX'; -exports[1705] = 'ER_STMT_CACHE_FULL'; -exports[1706] = 'ER_MULTI_UPDATE_KEY_CONFLICT'; -exports[1707] = 'ER_TABLE_NEEDS_REBUILD'; -exports[1708] = 'WARN_OPTION_BELOW_LIMIT'; -exports[1709] = 'ER_INDEX_COLUMN_TOO_LONG'; -exports[1710] = 'ER_ERROR_IN_TRIGGER_BODY'; -exports[1711] = 'ER_ERROR_IN_UNKNOWN_TRIGGER_BODY'; -exports[1712] = 'ER_INDEX_CORRUPT'; -exports[1713] = 'ER_UNDO_RECORD_TOO_BIG'; -exports[1714] = 'ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT'; -exports[1715] = 'ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE'; -exports[1716] = 'ER_BINLOG_UNSAFE_REPLACE_SELECT'; -exports[1717] = 'ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT'; -exports[1718] = 'ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT'; -exports[1719] = 'ER_BINLOG_UNSAFE_UPDATE_IGNORE'; -exports[1720] = 'ER_PLUGIN_NO_UNINSTALL'; -exports[1721] = 'ER_PLUGIN_NO_INSTALL'; -exports[1722] = 'ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT'; -exports[1723] = 'ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC'; -exports[1724] = 'ER_BINLOG_UNSAFE_INSERT_TWO_KEYS'; -exports[1725] = 'ER_TABLE_IN_FK_CHECK'; -exports[1726] = 'ER_UNSUPPORTED_ENGINE'; -exports[1727] = 'ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST'; -exports[1728] = 'ER_CANNOT_LOAD_FROM_TABLE_V2'; -exports[1729] = 'ER_MASTER_DELAY_VALUE_OUT_OF_RANGE'; -exports[1730] = 'ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT'; -exports[1731] = 'ER_PARTITION_EXCHANGE_DIFFERENT_OPTION'; -exports[1732] = 'ER_PARTITION_EXCHANGE_PART_TABLE'; -exports[1733] = 'ER_PARTITION_EXCHANGE_TEMP_TABLE'; -exports[1734] = 'ER_PARTITION_INSTEAD_OF_SUBPARTITION'; -exports[1735] = 'ER_UNKNOWN_PARTITION'; -exports[1736] = 'ER_TABLES_DIFFERENT_METADATA'; -exports[1737] = 'ER_ROW_DOES_NOT_MATCH_PARTITION'; -exports[1738] = 'ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX'; -exports[1739] = 'ER_WARN_INDEX_NOT_APPLICABLE'; -exports[1740] = 'ER_PARTITION_EXCHANGE_FOREIGN_KEY'; -exports[1741] = 'ER_NO_SUCH_KEY_VALUE'; -exports[1742] = 'ER_RPL_INFO_DATA_TOO_LONG'; -exports[1743] = 'ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE'; -exports[1744] = 'ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE'; -exports[1745] = 'ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX'; -exports[1746] = 'ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT'; -exports[1747] = 'ER_PARTITION_CLAUSE_ON_NONPARTITIONED'; -exports[1748] = 'ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET'; -exports[1749] = 'ER_NO_SUCH_PARTITION'; -exports[1750] = 'ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE'; -exports[1751] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE'; -exports[1752] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE'; -exports[1753] = 'ER_MTS_FEATURE_IS_NOT_SUPPORTED'; -exports[1754] = 'ER_MTS_UPDATED_DBS_GREATER_MAX'; -exports[1755] = 'ER_MTS_CANT_PARALLEL'; -exports[1756] = 'ER_MTS_INCONSISTENT_DATA'; -exports[1757] = 'ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING'; -exports[1758] = 'ER_DA_INVALID_CONDITION_NUMBER'; -exports[1759] = 'ER_INSECURE_PLAIN_TEXT'; -exports[1760] = 'ER_INSECURE_CHANGE_MASTER'; -exports[1761] = 'ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO'; -exports[1762] = 'ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO'; -exports[1763] = 'ER_SQLTHREAD_WITH_SECURE_SLAVE'; -exports[1764] = 'ER_TABLE_HAS_NO_FT'; -exports[1765] = 'ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER'; -exports[1766] = 'ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION'; -exports[1767] = 'ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST'; -exports[1768] = 'ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION'; -exports[1769] = 'ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION'; -exports[1770] = 'ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL'; -exports[1771] = 'ER_SKIPPING_LOGGED_TRANSACTION'; -exports[1772] = 'ER_MALFORMED_GTID_SET_SPECIFICATION'; -exports[1773] = 'ER_MALFORMED_GTID_SET_ENCODING'; -exports[1774] = 'ER_MALFORMED_GTID_SPECIFICATION'; -exports[1775] = 'ER_GNO_EXHAUSTED'; -exports[1776] = 'ER_BAD_SLAVE_AUTO_POSITION'; -exports[1777] = 'ER_AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF'; -exports[1778] = 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET'; -exports[1779] = 'ER_GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON'; -exports[1780] = 'ER_GTID_MODE_REQUIRES_BINLOG'; -exports[1781] = 'ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF'; -exports[1782] = 'ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON'; -exports[1783] = 'ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF'; -exports[1784] = 'ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF'; -exports[1785] = 'ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE'; -exports[1786] = 'ER_GTID_UNSAFE_CREATE_SELECT'; -exports[1787] = 'ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION'; -exports[1788] = 'ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME'; -exports[1789] = 'ER_MASTER_HAS_PURGED_REQUIRED_GTIDS'; -exports[1790] = 'ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID'; -exports[1791] = 'ER_UNKNOWN_EXPLAIN_FORMAT'; -exports[1792] = 'ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION'; -exports[1793] = 'ER_TOO_LONG_TABLE_PARTITION_COMMENT'; -exports[1794] = 'ER_SLAVE_CONFIGURATION'; -exports[1795] = 'ER_INNODB_FT_LIMIT'; -exports[1796] = 'ER_INNODB_NO_FT_TEMP_TABLE'; -exports[1797] = 'ER_INNODB_FT_WRONG_DOCID_COLUMN'; -exports[1798] = 'ER_INNODB_FT_WRONG_DOCID_INDEX'; -exports[1799] = 'ER_INNODB_ONLINE_LOG_TOO_BIG'; -exports[1800] = 'ER_UNKNOWN_ALTER_ALGORITHM'; -exports[1801] = 'ER_UNKNOWN_ALTER_LOCK'; -exports[1802] = 'ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS'; -exports[1803] = 'ER_MTS_RECOVERY_FAILURE'; -exports[1804] = 'ER_MTS_RESET_WORKERS'; -exports[1805] = 'ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2'; -exports[1806] = 'ER_SLAVE_SILENT_RETRY_TRANSACTION'; -exports[1807] = 'ER_DISCARD_FK_CHECKS_RUNNING'; -exports[1808] = 'ER_TABLE_SCHEMA_MISMATCH'; -exports[1809] = 'ER_TABLE_IN_SYSTEM_TABLESPACE'; -exports[1810] = 'ER_IO_READ_ERROR'; -exports[1811] = 'ER_IO_WRITE_ERROR'; -exports[1812] = 'ER_TABLESPACE_MISSING'; -exports[1813] = 'ER_TABLESPACE_EXISTS'; -exports[1814] = 'ER_TABLESPACE_DISCARDED'; -exports[1815] = 'ER_INTERNAL_ERROR'; -exports[1816] = 'ER_INNODB_IMPORT_ERROR'; -exports[1817] = 'ER_INNODB_INDEX_CORRUPT'; -exports[1818] = 'ER_INVALID_YEAR_COLUMN_LENGTH'; -exports[1819] = 'ER_NOT_VALID_PASSWORD'; -exports[1820] = 'ER_MUST_CHANGE_PASSWORD'; -exports[1821] = 'ER_FK_NO_INDEX_CHILD'; -exports[1822] = 'ER_FK_NO_INDEX_PARENT'; -exports[1823] = 'ER_FK_FAIL_ADD_SYSTEM'; -exports[1824] = 'ER_FK_CANNOT_OPEN_PARENT'; -exports[1825] = 'ER_FK_INCORRECT_OPTION'; -exports[1826] = 'ER_FK_DUP_NAME'; -exports[1827] = 'ER_PASSWORD_FORMAT'; -exports[1828] = 'ER_FK_COLUMN_CANNOT_DROP'; -exports[1829] = 'ER_FK_COLUMN_CANNOT_DROP_CHILD'; -exports[1830] = 'ER_FK_COLUMN_NOT_NULL'; -exports[1831] = 'ER_DUP_INDEX'; -exports[1832] = 'ER_FK_COLUMN_CANNOT_CHANGE'; -exports[1833] = 'ER_FK_COLUMN_CANNOT_CHANGE_CHILD'; -exports[1834] = 'ER_FK_CANNOT_DELETE_PARENT'; -exports[1835] = 'ER_MALFORMED_PACKET'; -exports[1836] = 'ER_READ_ONLY_MODE'; -exports[1837] = 'ER_GTID_NEXT_TYPE_UNDEFINED_GROUP'; -exports[1838] = 'ER_VARIABLE_NOT_SETTABLE_IN_SP'; -exports[1839] = 'ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF'; -exports[1840] = 'ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY'; -exports[1841] = 'ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY'; -exports[1842] = 'ER_GTID_PURGED_WAS_CHANGED'; -exports[1843] = 'ER_GTID_EXECUTED_WAS_CHANGED'; -exports[1844] = 'ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES'; -exports[1845] = 'ER_ALTER_OPERATION_NOT_SUPPORTED'; -exports[1846] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON'; -exports[1847] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY'; -exports[1848] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION'; -exports[1849] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME'; -exports[1850] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE'; -exports[1851] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK'; -exports[1852] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE'; -exports[1853] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK'; -exports[1854] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC'; -exports[1855] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS'; -exports[1856] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS'; -exports[1857] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS'; -exports[1858] = 'ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE'; -exports[1859] = 'ER_DUP_UNKNOWN_IN_INDEX'; -exports[1860] = 'ER_IDENT_CAUSES_TOO_LONG_PATH'; -exports[1861] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL'; -exports[1862] = 'ER_MUST_CHANGE_PASSWORD_LOGIN'; -exports[1863] = 'ER_ROW_IN_WRONG_PARTITION'; -exports[1864] = 'ER_MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX'; -exports[1865] = 'ER_INNODB_NO_FT_USES_PARSER'; -exports[1866] = 'ER_BINLOG_LOGICAL_CORRUPTION'; -exports[1867] = 'ER_WARN_PURGE_LOG_IN_USE'; -exports[1868] = 'ER_WARN_PURGE_LOG_IS_ACTIVE'; -exports[1869] = 'ER_AUTO_INCREMENT_CONFLICT'; -exports[1870] = 'WARN_ON_BLOCKHOLE_IN_RBR'; -exports[1871] = 'ER_SLAVE_MI_INIT_REPOSITORY'; -exports[1872] = 'ER_SLAVE_RLI_INIT_REPOSITORY'; -exports[1873] = 'ER_ACCESS_DENIED_CHANGE_USER_ERROR'; -exports[1874] = 'ER_INNODB_READ_ONLY'; -exports[1875] = 'ER_STOP_SLAVE_SQL_THREAD_TIMEOUT'; -exports[1876] = 'ER_STOP_SLAVE_IO_THREAD_TIMEOUT'; -exports[1877] = 'ER_TABLE_CORRUPT'; -exports[1878] = 'ER_TEMP_FILE_WRITE_FAILURE'; -exports[1879] = 'ER_INNODB_FT_AUX_NOT_HEX_ID'; -exports[1880] = 'ER_OLD_TEMPORALS_UPGRADED'; -exports[1881] = 'ER_INNODB_FORCED_RECOVERY'; -exports[1882] = 'ER_AES_INVALID_IV'; -exports[1883] = 'ER_PLUGIN_CANNOT_BE_UNINSTALLED'; -exports[1884] = 'ER_GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_GTID_GROUP'; -exports[1885] = 'ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER'; -exports[3000] = 'ER_FILE_CORRUPT'; -exports[3001] = 'ER_ERROR_ON_MASTER'; -exports[3002] = 'ER_INCONSISTENT_ERROR'; -exports[3003] = 'ER_STORAGE_ENGINE_NOT_LOADED'; -exports[3004] = 'ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER'; -exports[3005] = 'ER_WARN_LEGACY_SYNTAX_CONVERTED'; -exports[3006] = 'ER_BINLOG_UNSAFE_FULLTEXT_PLUGIN'; -exports[3007] = 'ER_CANNOT_DISCARD_TEMPORARY_TABLE'; -exports[3008] = 'ER_FK_DEPTH_EXCEEDED'; -exports[3009] = 'ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2'; -exports[3010] = 'ER_WARN_TRIGGER_DOESNT_HAVE_CREATED'; -exports[3011] = 'ER_REFERENCED_TRG_DOES_NOT_EXIST'; -exports[3012] = 'ER_EXPLAIN_NOT_SUPPORTED'; -exports[3013] = 'ER_INVALID_FIELD_SIZE'; -exports[3014] = 'ER_MISSING_HA_CREATE_OPTION'; -exports[3015] = 'ER_ENGINE_OUT_OF_MEMORY'; -exports[3016] = 'ER_PASSWORD_EXPIRE_ANONYMOUS_USER'; -exports[3017] = 'ER_SLAVE_SQL_THREAD_MUST_STOP'; -exports[3018] = 'ER_NO_FT_MATERIALIZED_SUBQUERY'; -exports[3019] = 'ER_INNODB_UNDO_LOG_FULL'; -exports[3020] = 'ER_INVALID_ARGUMENT_FOR_LOGARITHM'; -exports[3021] = 'ER_SLAVE_CHANNEL_IO_THREAD_MUST_STOP'; -exports[3022] = 'ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO'; -exports[3023] = 'ER_WARN_ONLY_MASTER_LOG_FILE_NO_POS'; -exports[3024] = 'ER_QUERY_TIMEOUT'; -exports[3025] = 'ER_NON_RO_SELECT_DISABLE_TIMER'; -exports[3026] = 'ER_DUP_LIST_ENTRY'; -exports[3027] = 'ER_SQL_MODE_NO_EFFECT'; -exports[3028] = 'ER_AGGREGATE_ORDER_FOR_UNION'; -exports[3029] = 'ER_AGGREGATE_ORDER_NON_AGG_QUERY'; -exports[3030] = 'ER_SLAVE_WORKER_STOPPED_PREVIOUS_THD_ERROR'; -exports[3031] = 'ER_DONT_SUPPORT_SLAVE_PRESERVE_COMMIT_ORDER'; -exports[3032] = 'ER_SERVER_OFFLINE_MODE'; -exports[3033] = 'ER_GIS_DIFFERENT_SRIDS'; -exports[3034] = 'ER_GIS_UNSUPPORTED_ARGUMENT'; -exports[3035] = 'ER_GIS_UNKNOWN_ERROR'; -exports[3036] = 'ER_GIS_UNKNOWN_EXCEPTION'; -exports[3037] = 'ER_GIS_INVALID_DATA'; -exports[3038] = 'ER_BOOST_GEOMETRY_EMPTY_INPUT_EXCEPTION'; -exports[3039] = 'ER_BOOST_GEOMETRY_CENTROID_EXCEPTION'; -exports[3040] = 'ER_BOOST_GEOMETRY_OVERLAY_INVALID_INPUT_EXCEPTION'; -exports[3041] = 'ER_BOOST_GEOMETRY_TURN_INFO_EXCEPTION'; -exports[3042] = 'ER_BOOST_GEOMETRY_SELF_INTERSECTION_POINT_EXCEPTION'; -exports[3043] = 'ER_BOOST_GEOMETRY_UNKNOWN_EXCEPTION'; -exports[3044] = 'ER_STD_BAD_ALLOC_ERROR'; -exports[3045] = 'ER_STD_DOMAIN_ERROR'; -exports[3046] = 'ER_STD_LENGTH_ERROR'; -exports[3047] = 'ER_STD_INVALID_ARGUMENT'; -exports[3048] = 'ER_STD_OUT_OF_RANGE_ERROR'; -exports[3049] = 'ER_STD_OVERFLOW_ERROR'; -exports[3050] = 'ER_STD_RANGE_ERROR'; -exports[3051] = 'ER_STD_UNDERFLOW_ERROR'; -exports[3052] = 'ER_STD_LOGIC_ERROR'; -exports[3053] = 'ER_STD_RUNTIME_ERROR'; -exports[3054] = 'ER_STD_UNKNOWN_EXCEPTION'; -exports[3055] = 'ER_GIS_DATA_WRONG_ENDIANESS'; -exports[3056] = 'ER_CHANGE_MASTER_PASSWORD_LENGTH'; -exports[3057] = 'ER_USER_LOCK_WRONG_NAME'; -exports[3058] = 'ER_USER_LOCK_DEADLOCK'; -exports[3059] = 'ER_REPLACE_INACCESSIBLE_ROWS'; -exports[3060] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_GIS'; -exports[3061] = 'ER_ILLEGAL_USER_VAR'; -exports[3062] = 'ER_GTID_MODE_OFF'; -exports[3063] = 'ER_UNSUPPORTED_BY_REPLICATION_THREAD'; -exports[3064] = 'ER_INCORRECT_TYPE'; -exports[3065] = 'ER_FIELD_IN_ORDER_NOT_SELECT'; -exports[3066] = 'ER_AGGREGATE_IN_ORDER_NOT_SELECT'; -exports[3067] = 'ER_INVALID_RPL_WILD_TABLE_FILTER_PATTERN'; -exports[3068] = 'ER_NET_OK_PACKET_TOO_LARGE'; -exports[3069] = 'ER_INVALID_JSON_DATA'; -exports[3070] = 'ER_INVALID_GEOJSON_MISSING_MEMBER'; -exports[3071] = 'ER_INVALID_GEOJSON_WRONG_TYPE'; -exports[3072] = 'ER_INVALID_GEOJSON_UNSPECIFIED'; -exports[3073] = 'ER_DIMENSION_UNSUPPORTED'; -exports[3074] = 'ER_SLAVE_CHANNEL_DOES_NOT_EXIST'; -exports[3075] = 'ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT'; -exports[3076] = 'ER_SLAVE_CHANNEL_NAME_INVALID_OR_TOO_LONG'; -exports[3077] = 'ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORY'; -exports[3078] = 'ER_SLAVE_CHANNEL_DELETE'; -exports[3079] = 'ER_SLAVE_MULTIPLE_CHANNELS_CMD'; -exports[3080] = 'ER_SLAVE_MAX_CHANNELS_EXCEEDED'; -exports[3081] = 'ER_SLAVE_CHANNEL_MUST_STOP'; -exports[3082] = 'ER_SLAVE_CHANNEL_NOT_RUNNING'; -exports[3083] = 'ER_SLAVE_CHANNEL_WAS_RUNNING'; -exports[3084] = 'ER_SLAVE_CHANNEL_WAS_NOT_RUNNING'; -exports[3085] = 'ER_SLAVE_CHANNEL_SQL_THREAD_MUST_STOP'; -exports[3086] = 'ER_SLAVE_CHANNEL_SQL_SKIP_COUNTER'; -exports[3087] = 'ER_WRONG_FIELD_WITH_GROUP_V2'; -exports[3088] = 'ER_MIX_OF_GROUP_FUNC_AND_FIELDS_V2'; -exports[3089] = 'ER_WARN_DEPRECATED_SYSVAR_UPDATE'; -exports[3090] = 'ER_WARN_DEPRECATED_SQLMODE'; -exports[3091] = 'ER_CANNOT_LOG_PARTIAL_DROP_DATABASE_WITH_GTID'; -exports[3092] = 'ER_GROUP_REPLICATION_CONFIGURATION'; -exports[3093] = 'ER_GROUP_REPLICATION_RUNNING'; -exports[3094] = 'ER_GROUP_REPLICATION_APPLIER_INIT_ERROR'; -exports[3095] = 'ER_GROUP_REPLICATION_STOP_APPLIER_THREAD_TIMEOUT'; -exports[3096] = 'ER_GROUP_REPLICATION_COMMUNICATION_LAYER_SESSION_ERROR'; -exports[3097] = 'ER_GROUP_REPLICATION_COMMUNICATION_LAYER_JOIN_ERROR'; -exports[3098] = 'ER_BEFORE_DML_VALIDATION_ERROR'; -exports[3099] = 'ER_PREVENTS_VARIABLE_WITHOUT_RBR'; -exports[3100] = 'ER_RUN_HOOK_ERROR'; -exports[3101] = 'ER_TRANSACTION_ROLLBACK_DURING_COMMIT'; -exports[3102] = 'ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED'; -exports[3103] = 'ER_UNSUPPORTED_ALTER_INPLACE_ON_VIRTUAL_COLUMN'; -exports[3104] = 'ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN'; -exports[3105] = 'ER_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN'; -exports[3106] = 'ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN'; -exports[3107] = 'ER_GENERATED_COLUMN_NON_PRIOR'; -exports[3108] = 'ER_DEPENDENT_BY_GENERATED_COLUMN'; -exports[3109] = 'ER_GENERATED_COLUMN_REF_AUTO_INC'; -exports[3110] = 'ER_FEATURE_NOT_AVAILABLE'; -exports[3111] = 'ER_CANT_SET_GTID_MODE'; -exports[3112] = 'ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF'; -exports[3113] = 'ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION'; -exports[3114] = 'ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON'; -exports[3115] = 'ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF'; -exports[3116] = 'ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS'; -exports[3117] = 'ER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS'; -exports[3118] = 'ER_ACCOUNT_HAS_BEEN_LOCKED'; -exports[3119] = 'ER_WRONG_TABLESPACE_NAME'; -exports[3120] = 'ER_TABLESPACE_IS_NOT_EMPTY'; -exports[3121] = 'ER_WRONG_FILE_NAME'; -exports[3122] = 'ER_BOOST_GEOMETRY_INCONSISTENT_TURNS_EXCEPTION'; -exports[3123] = 'ER_WARN_OPTIMIZER_HINT_SYNTAX_ERROR'; -exports[3124] = 'ER_WARN_BAD_MAX_EXECUTION_TIME'; -exports[3125] = 'ER_WARN_UNSUPPORTED_MAX_EXECUTION_TIME'; -exports[3126] = 'ER_WARN_CONFLICTING_HINT'; -exports[3127] = 'ER_WARN_UNKNOWN_QB_NAME'; -exports[3128] = 'ER_UNRESOLVED_HINT_NAME'; -exports[3129] = 'ER_WARN_ON_MODIFYING_GTID_EXECUTED_TABLE'; -exports[3130] = 'ER_PLUGGABLE_PROTOCOL_COMMAND_NOT_SUPPORTED'; -exports[3131] = 'ER_LOCKING_SERVICE_WRONG_NAME'; -exports[3132] = 'ER_LOCKING_SERVICE_DEADLOCK'; -exports[3133] = 'ER_LOCKING_SERVICE_TIMEOUT'; -exports[3134] = 'ER_GIS_MAX_POINTS_IN_GEOMETRY_OVERFLOWED'; -exports[3135] = 'ER_SQL_MODE_MERGED'; -exports[3136] = 'ER_VTOKEN_PLUGIN_TOKEN_MISMATCH'; -exports[3137] = 'ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND'; -exports[3138] = 'ER_CANT_SET_VARIABLE_WHEN_OWNING_GTID'; -exports[3139] = 'ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED'; -exports[3140] = 'ER_INVALID_JSON_TEXT'; -exports[3141] = 'ER_INVALID_JSON_TEXT_IN_PARAM'; -exports[3142] = 'ER_INVALID_JSON_BINARY_DATA'; -exports[3143] = 'ER_INVALID_JSON_PATH'; -exports[3144] = 'ER_INVALID_JSON_CHARSET'; -exports[3145] = 'ER_INVALID_JSON_CHARSET_IN_FUNCTION'; -exports[3146] = 'ER_INVALID_TYPE_FOR_JSON'; -exports[3147] = 'ER_INVALID_CAST_TO_JSON'; -exports[3148] = 'ER_INVALID_JSON_PATH_CHARSET'; -exports[3149] = 'ER_INVALID_JSON_PATH_WILDCARD'; -exports[3150] = 'ER_JSON_VALUE_TOO_BIG'; -exports[3151] = 'ER_JSON_KEY_TOO_BIG'; -exports[3152] = 'ER_JSON_USED_AS_KEY'; -exports[3153] = 'ER_JSON_VACUOUS_PATH'; -exports[3154] = 'ER_JSON_BAD_ONE_OR_ALL_ARG'; -exports[3155] = 'ER_NUMERIC_JSON_VALUE_OUT_OF_RANGE'; -exports[3156] = 'ER_INVALID_JSON_VALUE_FOR_CAST'; -exports[3157] = 'ER_JSON_DOCUMENT_TOO_DEEP'; -exports[3158] = 'ER_JSON_DOCUMENT_NULL_KEY'; -exports[3159] = 'ER_SECURE_TRANSPORT_REQUIRED'; -exports[3160] = 'ER_NO_SECURE_TRANSPORTS_CONFIGURED'; -exports[3161] = 'ER_DISABLED_STORAGE_ENGINE'; -exports[3162] = 'ER_USER_DOES_NOT_EXIST'; -exports[3163] = 'ER_USER_ALREADY_EXISTS'; -exports[3164] = 'ER_AUDIT_API_ABORT'; -exports[3165] = 'ER_INVALID_JSON_PATH_ARRAY_CELL'; -exports[3166] = 'ER_BUFPOOL_RESIZE_INPROGRESS'; -exports[3167] = 'ER_FEATURE_DISABLED_SEE_DOC'; -exports[3168] = 'ER_SERVER_ISNT_AVAILABLE'; -exports[3169] = 'ER_SESSION_WAS_KILLED'; -exports[3170] = 'ER_CAPACITY_EXCEEDED'; -exports[3171] = 'ER_CAPACITY_EXCEEDED_IN_RANGE_OPTIMIZER'; -exports[3172] = 'ER_TABLE_NEEDS_UPG_PART'; -exports[3173] = 'ER_CANT_WAIT_FOR_EXECUTED_GTID_SET_WHILE_OWNING_A_GTID'; -exports[3174] = 'ER_CANNOT_ADD_FOREIGN_BASE_COL_VIRTUAL'; -exports[3175] = 'ER_CANNOT_CREATE_VIRTUAL_INDEX_CONSTRAINT'; -exports[3176] = 'ER_ERROR_ON_MODIFYING_GTID_EXECUTED_TABLE'; -exports[3177] = 'ER_LOCK_REFUSED_BY_ENGINE'; -exports[3178] = 'ER_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN'; -exports[3179] = 'ER_MASTER_KEY_ROTATION_NOT_SUPPORTED_BY_SE'; -exports[3180] = 'ER_MASTER_KEY_ROTATION_ERROR_BY_SE'; -exports[3181] = 'ER_MASTER_KEY_ROTATION_BINLOG_FAILED'; -exports[3182] = 'ER_MASTER_KEY_ROTATION_SE_UNAVAILABLE'; -exports[3183] = 'ER_TABLESPACE_CANNOT_ENCRYPT'; -exports[3184] = 'ER_INVALID_ENCRYPTION_OPTION'; -exports[3185] = 'ER_CANNOT_FIND_KEY_IN_KEYRING'; -exports[3186] = 'ER_CAPACITY_EXCEEDED_IN_PARSER'; -exports[3187] = 'ER_UNSUPPORTED_ALTER_ENCRYPTION_INPLACE'; -exports[3188] = 'ER_KEYRING_UDF_KEYRING_SERVICE_ERROR'; -exports[3189] = 'ER_USER_COLUMN_OLD_LENGTH'; -exports[3190] = 'ER_CANT_RESET_MASTER'; -exports[3191] = 'ER_GROUP_REPLICATION_MAX_GROUP_SIZE'; -exports[3192] = 'ER_CANNOT_ADD_FOREIGN_BASE_COL_STORED'; -exports[3193] = 'ER_TABLE_REFERENCED'; -exports[3194] = 'ER_PARTITION_ENGINE_DEPRECATED_FOR_TABLE'; -exports[3195] = 'ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO'; -exports[3196] = 'ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID'; -exports[3197] = 'ER_XA_RETRY'; -exports[3198] = 'ER_KEYRING_AWS_UDF_AWS_KMS_ERROR'; - - -/***/ }), -/* 67 */ -/***/ (function(module, exports, __webpack_require__) { - -var Sequence = __webpack_require__(3); -var Util = __webpack_require__(0); -var Packets = __webpack_require__(2); -var Auth = __webpack_require__(18); -var ClientConstants = __webpack_require__(10); - -module.exports = Handshake; -Util.inherits(Handshake, Sequence); -function Handshake(options, callback) { - Sequence.call(this, options, callback); - - options = options || {}; - - this._config = options.config; - this._handshakeInitializationPacket = null; -} - -Handshake.prototype.determinePacket = function determinePacket(firstByte, parser) { - if (firstByte === 0xff) { - return Packets.ErrorPacket; - } - - if (!this._handshakeInitializationPacket) { - return Packets.HandshakeInitializationPacket; - } - - if (firstByte === 0xfe) { - return (parser.packetLength() === 1) - ? Packets.UseOldPasswordPacket - : Packets.AuthSwitchRequestPacket; - } - - return undefined; -}; - -Handshake.prototype['AuthSwitchRequestPacket'] = function (packet) { - switch (packet.authMethodName) { - case 'mysql_native_password': - case 'mysql_old_password': - default: - } - - if (packet.authMethodName === 'mysql_native_password') { - var challenge = packet.authMethodData.slice(0, 20); - - this.emit('packet', new Packets.AuthSwitchResponsePacket({ - data: Auth.token(this._config.password, challenge) - })); - } else { - var err = new Error( - 'MySQL is requesting the ' + packet.authMethodName + ' authentication method, which is not supported.' - ); - - err.code = 'UNSUPPORTED_AUTH_METHOD'; - err.fatal = true; - - this.end(err); - } -}; - -Handshake.prototype['HandshakeInitializationPacket'] = function(packet) { - this._handshakeInitializationPacket = packet; - - this._config.protocol41 = packet.protocol41; - - var serverSSLSupport = packet.serverCapabilities1 & ClientConstants.CLIENT_SSL; - - if (this._config.ssl) { - if (!serverSSLSupport) { - var err = new Error('Server does not support secure connection'); - - err.code = 'HANDSHAKE_NO_SSL_SUPPORT'; - err.fatal = true; - - this.end(err); - return; - } - - this._config.clientFlags |= ClientConstants.CLIENT_SSL; - this.emit('packet', new Packets.SSLRequestPacket({ - clientFlags : this._config.clientFlags, - maxPacketSize : this._config.maxPacketSize, - charsetNumber : this._config.charsetNumber - })); - this.emit('start-tls'); - } else { - this._sendCredentials(); - } -}; - -Handshake.prototype._tlsUpgradeCompleteHandler = function() { - this._sendCredentials(); -}; - -Handshake.prototype._sendCredentials = function() { - var packet = this._handshakeInitializationPacket; - this.emit('packet', new Packets.ClientAuthenticationPacket({ - clientFlags : this._config.clientFlags, - maxPacketSize : this._config.maxPacketSize, - charsetNumber : this._config.charsetNumber, - user : this._config.user, - database : this._config.database, - protocol41 : packet.protocol41, - scrambleBuff : (packet.protocol41) - ? Auth.token(this._config.password, packet.scrambleBuff()) - : Auth.scramble323(packet.scrambleBuff(), this._config.password) - })); -}; - -Handshake.prototype['UseOldPasswordPacket'] = function() { - if (!this._config.insecureAuth) { - var err = new Error( - 'MySQL server is requesting the old and insecure pre-4.1 auth mechanism. ' + - 'Upgrade the user password or use the {insecureAuth: true} option.' - ); - - err.code = 'HANDSHAKE_INSECURE_AUTH'; - err.fatal = true; - - this.end(err); - return; - } - - this.emit('packet', new Packets.OldPasswordPacket({ - scrambleBuff: Auth.scramble323(this._handshakeInitializationPacket.scrambleBuff(), this._config.password) - })); -}; - -Handshake.prototype['ErrorPacket'] = function(packet) { - var err = this._packetToError(packet, true); - err.fatal = true; - this.end(err); -}; - - -/***/ }), -/* 68 */ -/***/ (function(module, exports, __webpack_require__) { - -var Sequence = __webpack_require__(3); -var Util = __webpack_require__(0); -var Packets = __webpack_require__(2); - -module.exports = Ping; -Util.inherits(Ping, Sequence); - -function Ping(options, callback) { - if (!callback && typeof options === 'function') { - callback = options; - options = {}; - } - - Sequence.call(this, options, callback); -} - -Ping.prototype.start = function() { - this.emit('packet', new Packets.ComPingPacket()); -}; - - -/***/ }), -/* 69 */ -/***/ (function(module, exports) { - -module.exports = ResultSet; -function ResultSet(resultSetHeaderPacket) { - this.resultSetHeaderPacket = resultSetHeaderPacket; - this.fieldPackets = []; - this.eofPackets = []; - this.rows = []; -} - - -/***/ }), -/* 70 */ -/***/ (function(module, exports) { - -// Manually extracted from mysql-5.5.23/include/mysql_com.h - -/** - Is raised when a multi-statement transaction - has been started, either explicitly, by means - of BEGIN or COMMIT AND CHAIN, or - implicitly, by the first transactional - statement, when autocommit=off. -*/ -exports.SERVER_STATUS_IN_TRANS = 1; -exports.SERVER_STATUS_AUTOCOMMIT = 2; /* Server in auto_commit mode */ -exports.SERVER_MORE_RESULTS_EXISTS = 8; /* Multi query - next query exists */ -exports.SERVER_QUERY_NO_GOOD_INDEX_USED = 16; -exports.SERVER_QUERY_NO_INDEX_USED = 32; -/** - The server was able to fulfill the clients request and opened a - read-only non-scrollable cursor for a query. This flag comes - in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands. -*/ -exports.SERVER_STATUS_CURSOR_EXISTS = 64; -/** - This flag is sent when a read-only cursor is exhausted, in reply to - COM_STMT_FETCH command. -*/ -exports.SERVER_STATUS_LAST_ROW_SENT = 128; -exports.SERVER_STATUS_DB_DROPPED = 256; /* A database was dropped */ -exports.SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512; -/** - Sent to the client if after a prepared statement reprepare - we discovered that the new statement returns a different - number of result set columns. -*/ -exports.SERVER_STATUS_METADATA_CHANGED = 1024; -exports.SERVER_QUERY_WAS_SLOW = 2048; - -/** - To mark ResultSet containing output parameter values. -*/ -exports.SERVER_PS_OUT_PARAMS = 4096; - - -/***/ }), -/* 71 */ -/***/ (function(module, exports, __webpack_require__) { - -var Stream = __webpack_require__(14); -if (process.env.READABLE_STREAM === 'disable' && Stream) { - module.exports = Stream; - exports = module.exports = Stream.Readable; - exports.Readable = Stream.Readable; - exports.Writable = Stream.Writable; - exports.Duplex = Stream.Duplex; - exports.Transform = Stream.Transform; - exports.PassThrough = Stream.PassThrough; - exports.Stream = Stream; -} else { - exports = module.exports = __webpack_require__(21); - exports.Stream = Stream || exports; - exports.Readable = exports; - exports.Writable = __webpack_require__(24); - exports.Duplex = __webpack_require__(5); - exports.Transform = __webpack_require__(26); - exports.PassThrough = __webpack_require__(76); -} - - -/***/ }), -/* 72 */ -/***/ (function(module, exports) { - -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; - - -/***/ }), -/* 73 */ -/***/ (function(module, exports) { - -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} - - -/***/ }), -/* 74 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/**/ - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Buffer = __webpack_require__(1).Buffer; -/**/ - -function copyBuffer(src, target, offset) { - src.copy(target, offset); -} - -module.exports = function () { - function BufferList() { - _classCallCheck(this, BufferList); - - this.head = null; - this.tail = null; - this.length = 0; - } - - BufferList.prototype.push = function push(v) { - var entry = { data: v, next: null }; - if (this.length > 0) this.tail.next = entry;else this.head = entry; - this.tail = entry; - ++this.length; - }; - - BufferList.prototype.unshift = function unshift(v) { - var entry = { data: v, next: this.head }; - if (this.length === 0) this.tail = entry; - this.head = entry; - ++this.length; - }; - - BufferList.prototype.shift = function shift() { - if (this.length === 0) return; - var ret = this.head.data; - if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; - --this.length; - return ret; - }; - - BufferList.prototype.clear = function clear() { - this.head = this.tail = null; - this.length = 0; - }; - - BufferList.prototype.join = function join(s) { - if (this.length === 0) return ''; - var p = this.head; - var ret = '' + p.data; - while (p = p.next) { - ret += s + p.data; - }return ret; - }; - - BufferList.prototype.concat = function concat(n) { - if (this.length === 0) return Buffer.alloc(0); - if (this.length === 1) return this.head.data; - var ret = Buffer.allocUnsafe(n >>> 0); - var p = this.head; - var i = 0; - while (p) { - copyBuffer(p.data, ret, i); - i += p.data.length; - p = p.next; - } - return ret; - }; - - return BufferList; -}(); - -/***/ }), -/* 75 */ -/***/ (function(module, exports, __webpack_require__) { - - -/** - * For Node.js, simply re-export the core `util.deprecate` function. - */ - -module.exports = __webpack_require__(0).deprecate; - - -/***/ }), -/* 76 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a passthrough stream. -// basically just the most minimal sort of Transform stream. -// Every written chunk gets output as-is. - - - -module.exports = PassThrough; - -var Transform = __webpack_require__(26); - -/**/ -var util = __webpack_require__(6); -util.inherits = __webpack_require__(7); -/**/ - -util.inherits(PassThrough, Transform); - -function PassThrough(options) { - if (!(this instanceof PassThrough)) return new PassThrough(options); - - Transform.call(this, options); -} - -PassThrough.prototype._transform = function (chunk, encoding, cb) { - cb(null, chunk); -}; - -/***/ }), -/* 77 */ -/***/ (function(module, exports, __webpack_require__) { - -var Sequence = __webpack_require__(3); -var Util = __webpack_require__(0); -var Packets = __webpack_require__(2); - -module.exports = Quit; -Util.inherits(Quit, Sequence); -function Quit(options, callback) { - if (!callback && typeof options === 'function') { - callback = options; - options = {}; - } - - Sequence.call(this, options, callback); - - this._started = false; -} - -Quit.prototype.end = function end(err) { - if (this._ended) { - return; - } - - if (!this._started) { - Sequence.prototype.end.call(this, err); - return; - } - - if (err && err.code === 'ECONNRESET' && err.syscall === 'read') { - // Ignore read errors after packet sent - Sequence.prototype.end.call(this); - return; - } - - Sequence.prototype.end.call(this, err); -}; - -Quit.prototype.start = function() { - this._started = true; - this.emit('packet', new Packets.ComQuitPacket()); -}; - - -/***/ }), -/* 78 */ -/***/ (function(module, exports, __webpack_require__) { - -var Sequence = __webpack_require__(3); -var Util = __webpack_require__(0); -var Packets = __webpack_require__(2); - -module.exports = Statistics; -Util.inherits(Statistics, Sequence); -function Statistics(options, callback) { - if (!callback && typeof options === 'function') { - callback = options; - options = {}; - } - - Sequence.call(this, options, callback); -} - -Statistics.prototype.start = function() { - this.emit('packet', new Packets.ComStatisticsPacket()); -}; - -Statistics.prototype['StatisticsPacket'] = function (packet) { - this.end(null, packet); -}; - -Statistics.prototype.determinePacket = function determinePacket(firstByte) { - if (firstByte === 0x55) { - return Packets.StatisticsPacket; - } - - return undefined; -}; - - -/***/ }), -/* 79 */ -/***/ (function(module, exports) { - -module.exports = require("timers"); - -/***/ }), -/* 80 */ -/***/ (function(module, exports, __webpack_require__) { - -var BIT_16 = Math.pow(2, 16); -var BIT_24 = Math.pow(2, 24); -var BUFFER_ALLOC_SIZE = Math.pow(2, 8); -// The maximum precision JS Numbers can hold precisely -// Don't panic: Good enough to represent byte values up to 8192 TB -var IEEE_754_BINARY_64_PRECISION = Math.pow(2, 53); -var MAX_PACKET_LENGTH = Math.pow(2, 24) - 1; -var Buffer = __webpack_require__(1).Buffer; - -module.exports = PacketWriter; -function PacketWriter() { - this._buffer = null; - this._offset = 0; -} - -PacketWriter.prototype.toBuffer = function toBuffer(parser) { - if (!this._buffer) { - this._buffer = Buffer.alloc(0); - this._offset = 0; - } - - var buffer = this._buffer; - var length = this._offset; - var packets = Math.floor(length / MAX_PACKET_LENGTH) + 1; - - this._buffer = Buffer.allocUnsafe(length + packets * 4); - this._offset = 0; - - for (var packet = 0; packet < packets; packet++) { - var isLast = (packet + 1 === packets); - var packetLength = (isLast) - ? length % MAX_PACKET_LENGTH - : MAX_PACKET_LENGTH; - - var packetNumber = parser.incrementPacketNumber(); - - this.writeUnsignedNumber(3, packetLength); - this.writeUnsignedNumber(1, packetNumber); - - var start = packet * MAX_PACKET_LENGTH; - var end = start + packetLength; - - this.writeBuffer(buffer.slice(start, end)); - } - - return this._buffer; -}; - -PacketWriter.prototype.writeUnsignedNumber = function(bytes, value) { - this._allocate(bytes); - - for (var i = 0; i < bytes; i++) { - this._buffer[this._offset++] = (value >> (i * 8)) & 0xff; - } -}; - -PacketWriter.prototype.writeFiller = function(bytes) { - this._allocate(bytes); - - for (var i = 0; i < bytes; i++) { - this._buffer[this._offset++] = 0x00; - } -}; - -PacketWriter.prototype.writeNullTerminatedString = function(value, encoding) { - // Typecast undefined into '' and numbers into strings - value = value || ''; - value = value + ''; - - var bytes = Buffer.byteLength(value, encoding || 'utf-8') + 1; - this._allocate(bytes); - - this._buffer.write(value, this._offset, encoding); - this._buffer[this._offset + bytes - 1] = 0x00; - - this._offset += bytes; -}; - -PacketWriter.prototype.writeString = function(value) { - // Typecast undefined into '' and numbers into strings - value = value || ''; - value = value + ''; - - var bytes = Buffer.byteLength(value, 'utf-8'); - this._allocate(bytes); - - this._buffer.write(value, this._offset, 'utf-8'); - - this._offset += bytes; -}; - -PacketWriter.prototype.writeBuffer = function(value) { - var bytes = value.length; - - this._allocate(bytes); - value.copy(this._buffer, this._offset); - this._offset += bytes; -}; - -PacketWriter.prototype.writeLengthCodedNumber = function(value) { - if (value === null) { - this._allocate(1); - this._buffer[this._offset++] = 251; - return; - } - - if (value <= 250) { - this._allocate(1); - this._buffer[this._offset++] = value; - return; - } - - if (value > IEEE_754_BINARY_64_PRECISION) { - throw new Error( - 'writeLengthCodedNumber: JS precision range exceeded, your ' + - 'number is > 53 bit: "' + value + '"' - ); - } - - if (value < BIT_16) { - this._allocate(3); - this._buffer[this._offset++] = 252; - } else if (value < BIT_24) { - this._allocate(4); - this._buffer[this._offset++] = 253; - } else { - this._allocate(9); - this._buffer[this._offset++] = 254; - } - - // 16 Bit - this._buffer[this._offset++] = value & 0xff; - this._buffer[this._offset++] = (value >> 8) & 0xff; - - if (value < BIT_16) { - return; - } - - // 24 Bit - this._buffer[this._offset++] = (value >> 16) & 0xff; - - if (value < BIT_24) { - return; - } - - this._buffer[this._offset++] = (value >> 24) & 0xff; - - // Hack: Get the most significant 32 bit (JS bitwise operators are 32 bit) - value = value.toString(2); - value = value.substr(0, value.length - 32); - value = parseInt(value, 2); - - this._buffer[this._offset++] = value & 0xff; - this._buffer[this._offset++] = (value >> 8) & 0xff; - this._buffer[this._offset++] = (value >> 16) & 0xff; - - // Set last byte to 0, as we can only support 53 bits in JS (see above) - this._buffer[this._offset++] = 0; -}; - -PacketWriter.prototype.writeLengthCodedBuffer = function(value) { - var bytes = value.length; - this.writeLengthCodedNumber(bytes); - this.writeBuffer(value); -}; - -PacketWriter.prototype.writeNullTerminatedBuffer = function(value) { - this.writeBuffer(value); - this.writeFiller(1); // 0x00 terminator -}; - -PacketWriter.prototype.writeLengthCodedString = function(value) { - if (value === null) { - this.writeLengthCodedNumber(null); - return; - } - - value = (value === undefined) - ? '' - : String(value); - - var bytes = Buffer.byteLength(value, 'utf-8'); - this.writeLengthCodedNumber(bytes); - - if (!bytes) { - return; - } - - this._allocate(bytes); - this._buffer.write(value, this._offset, 'utf-8'); - this._offset += bytes; -}; - -PacketWriter.prototype._allocate = function _allocate(bytes) { - if (!this._buffer) { - this._buffer = Buffer.alloc(Math.max(BUFFER_ALLOC_SIZE, bytes)); - this._offset = 0; - return; - } - - var bytesRemaining = this._buffer.length - this._offset; - if (bytesRemaining >= bytes) { - return; - } - - var newSize = this._buffer.length + Math.max(BUFFER_ALLOC_SIZE, bytes); - var oldBuffer = this._buffer; - - this._buffer = Buffer.alloc(newSize); - oldBuffer.copy(this._buffer); -}; - - -/***/ }), -/* 81 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(82); - - -/***/ }), -/* 82 */ -/***/ (function(module, exports) { - -var SqlString = exports; - -var ID_GLOBAL_REGEXP = /`/g; -var QUAL_GLOBAL_REGEXP = /\./g; -var CHARS_GLOBAL_REGEXP = /[\0\b\t\n\r\x1a\"\'\\]/g; // eslint-disable-line no-control-regex -var CHARS_ESCAPE_MAP = { - '\0' : '\\0', - '\b' : '\\b', - '\t' : '\\t', - '\n' : '\\n', - '\r' : '\\r', - '\x1a' : '\\Z', - '"' : '\\"', - '\'' : '\\\'', - '\\' : '\\\\' -}; - -SqlString.escapeId = function escapeId(val, forbidQualified) { - if (Array.isArray(val)) { - var sql = ''; - - for (var i = 0; i < val.length; i++) { - sql += (i === 0 ? '' : ', ') + SqlString.escapeId(val[i], forbidQualified); - } - - return sql; - } else if (forbidQualified) { - return '`' + String(val).replace(ID_GLOBAL_REGEXP, '``') + '`'; - } else { - return '`' + String(val).replace(ID_GLOBAL_REGEXP, '``').replace(QUAL_GLOBAL_REGEXP, '`.`') + '`'; - } -}; - -SqlString.escape = function escape(val, stringifyObjects, timeZone) { - if (val === undefined || val === null) { - return 'NULL'; - } - - switch (typeof val) { - case 'boolean': return (val) ? 'true' : 'false'; - case 'number': return val + ''; - case 'object': - if (val instanceof Date) { - return SqlString.dateToString(val, timeZone || 'local'); - } else if (Array.isArray(val)) { - return SqlString.arrayToList(val, timeZone); - } else if (Buffer.isBuffer(val)) { - return SqlString.bufferToString(val); - } else if (typeof val.toSqlString === 'function') { - return String(val.toSqlString()); - } else if (stringifyObjects) { - return escapeString(val.toString()); - } else { - return SqlString.objectToValues(val, timeZone); - } - default: return escapeString(val); - } -}; - -SqlString.arrayToList = function arrayToList(array, timeZone) { - var sql = ''; - - for (var i = 0; i < array.length; i++) { - var val = array[i]; - - if (Array.isArray(val)) { - sql += (i === 0 ? '' : ', ') + '(' + SqlString.arrayToList(val, timeZone) + ')'; - } else { - sql += (i === 0 ? '' : ', ') + SqlString.escape(val, true, timeZone); - } - } - - return sql; -}; - -SqlString.format = function format(sql, values, stringifyObjects, timeZone) { - if (values == null) { - return sql; - } - - if (!(values instanceof Array || Array.isArray(values))) { - values = [values]; - } - - var chunkIndex = 0; - var placeholdersRegex = /\?\??/g; - var result = ''; - var valuesIndex = 0; - var match; - - while (valuesIndex < values.length && (match = placeholdersRegex.exec(sql))) { - var value = match[0] === '??' - ? SqlString.escapeId(values[valuesIndex]) - : SqlString.escape(values[valuesIndex], stringifyObjects, timeZone); - - result += sql.slice(chunkIndex, match.index) + value; - chunkIndex = placeholdersRegex.lastIndex; - valuesIndex++; - } - - if (chunkIndex === 0) { - // Nothing was replaced - return sql; - } - - if (chunkIndex < sql.length) { - return result + sql.slice(chunkIndex); - } - - return result; -}; - -SqlString.dateToString = function dateToString(date, timeZone) { - var dt = new Date(date); - - if (isNaN(dt.getTime())) { - return 'NULL'; - } - - var year; - var month; - var day; - var hour; - var minute; - var second; - var millisecond; - - if (timeZone === 'local') { - year = dt.getFullYear(); - month = dt.getMonth() + 1; - day = dt.getDate(); - hour = dt.getHours(); - minute = dt.getMinutes(); - second = dt.getSeconds(); - millisecond = dt.getMilliseconds(); - } else { - var tz = convertTimezone(timeZone); - - if (tz !== false && tz !== 0) { - dt.setTime(dt.getTime() + (tz * 60000)); - } - - year = dt.getUTCFullYear(); - month = dt.getUTCMonth() + 1; - day = dt.getUTCDate(); - hour = dt.getUTCHours(); - minute = dt.getUTCMinutes(); - second = dt.getUTCSeconds(); - millisecond = dt.getUTCMilliseconds(); - } - - // YYYY-MM-DD HH:mm:ss.mmm - var str = zeroPad(year, 4) + '-' + zeroPad(month, 2) + '-' + zeroPad(day, 2) + ' ' + - zeroPad(hour, 2) + ':' + zeroPad(minute, 2) + ':' + zeroPad(second, 2) + '.' + - zeroPad(millisecond, 3); - - return escapeString(str); -}; - -SqlString.bufferToString = function bufferToString(buffer) { - return 'X' + escapeString(buffer.toString('hex')); -}; - -SqlString.objectToValues = function objectToValues(object, timeZone) { - var sql = ''; - - for (var key in object) { - var val = object[key]; - - if (typeof val === 'function') { - continue; - } - - sql += (sql.length === 0 ? '' : ', ') + SqlString.escapeId(key) + ' = ' + SqlString.escape(val, true, timeZone); - } - - return sql; -}; - -SqlString.raw = function raw(sql) { - if (typeof sql !== 'string') { - throw new TypeError('argument sql must be a string'); - } - - return { - toSqlString: function toSqlString() { return sql; } - }; -}; - -function escapeString(val) { - var chunkIndex = CHARS_GLOBAL_REGEXP.lastIndex = 0; - var escapedVal = ''; - var match; - - while ((match = CHARS_GLOBAL_REGEXP.exec(val))) { - escapedVal += val.slice(chunkIndex, match.index) + CHARS_ESCAPE_MAP[match[0]]; - chunkIndex = CHARS_GLOBAL_REGEXP.lastIndex; - } - - if (chunkIndex === 0) { - // Nothing was escaped - return "'" + val + "'"; - } - - if (chunkIndex < val.length) { - return "'" + escapedVal + val.slice(chunkIndex) + "'"; - } - - return "'" + escapedVal + "'"; -} - -function zeroPad(number, length) { - number = number.toString(); - while (number.length < length) { - number = '0' + number; - } - - return number; -} - -function convertTimezone(tz) { - if (tz === 'Z') { - return 0; - } - - var m = tz.match(/([\+\-\s])(\d\d):?(\d\d)?/); - if (m) { - return (m[1] === '-' ? -1 : 1) * (parseInt(m[2], 10) + ((m[3] ? parseInt(m[3], 10) : 0) / 60)) * 60; - } - return false; -} - - -/***/ }), -/* 83 */ -/***/ (function(module, exports, __webpack_require__) { - -var inherits = __webpack_require__(0).inherits; -var Connection = __webpack_require__(8); -var Events = __webpack_require__(4); - -module.exports = PoolConnection; -inherits(PoolConnection, Connection); - -function PoolConnection(pool, options) { - Connection.call(this, options); - this._pool = pool; - - // Bind connection to pool domain - if (Events.usingDomains) { - this.domain = pool.domain; - } - - // When a fatal error occurs the connection's protocol ends, which will cause - // the connection to end as well, thus we only need to watch for the end event - // and we will be notified of disconnects. - this.on('end', this._removeFromPool); - this.on('error', function (err) { - if (err.fatal) { - this._removeFromPool(); - } - }); -} - -PoolConnection.prototype.release = function release() { - var pool = this._pool; - - if (!pool || pool._closed) { - return undefined; - } - - return pool.releaseConnection(this); -}; - -// TODO: Remove this when we are removing PoolConnection#end -PoolConnection.prototype._realEnd = Connection.prototype.end; - -PoolConnection.prototype.end = function () { - console.warn( - 'Calling conn.end() to release a pooled connection is ' + - 'deprecated. In next version calling conn.end() will be ' + - 'restored to default conn.end() behavior. Use ' + - 'conn.release() instead.' - ); - this.release(); -}; - -PoolConnection.prototype.destroy = function () { - Connection.prototype.destroy.apply(this, arguments); - this._removeFromPool(this); -}; - -PoolConnection.prototype._removeFromPool = function _removeFromPool() { - if (!this._pool || this._pool._closed) { - return; - } - - var pool = this._pool; - this._pool = null; - - pool._purgeConnection(this); -}; - - -/***/ }), -/* 84 */ -/***/ (function(module, exports, __webpack_require__) { - -var Pool = __webpack_require__(28); -var PoolConfig = __webpack_require__(29); -var PoolNamespace = __webpack_require__(85); -var PoolSelector = __webpack_require__(30); -var Util = __webpack_require__(0); -var EventEmitter = __webpack_require__(4).EventEmitter; - -module.exports = PoolCluster; - -/** - * PoolCluster - * @constructor - * @param {object} [config] The pool cluster configuration - * @public - */ -function PoolCluster(config) { - EventEmitter.call(this); - - config = config || {}; - this._canRetry = typeof config.canRetry === 'undefined' ? true : config.canRetry; - this._defaultSelector = config.defaultSelector || 'RR'; - this._removeNodeErrorCount = config.removeNodeErrorCount || 5; - this._restoreNodeTimeout = config.restoreNodeTimeout || 0; - - this._closed = false; - this._findCaches = Object.create(null); - this._lastId = 0; - this._namespaces = Object.create(null); - this._nodes = Object.create(null); -} - -Util.inherits(PoolCluster, EventEmitter); - -PoolCluster.prototype.add = function add(id, config) { - if (this._closed) { - throw new Error('PoolCluster is closed.'); - } - - var nodeId = typeof id === 'object' - ? 'CLUSTER::' + (++this._lastId) - : String(id); - - if (this._nodes[nodeId] !== undefined) { - throw new Error('Node ID "' + nodeId + '" is already defined in PoolCluster.'); - } - - var poolConfig = typeof id !== 'object' - ? new PoolConfig(config) - : new PoolConfig(id); - - this._nodes[nodeId] = { - id : nodeId, - errorCount : 0, - pool : new Pool({config: poolConfig}), - _offlineUntil : 0 - }; - - this._clearFindCaches(); -}; - -PoolCluster.prototype.end = function end(callback) { - var cb = callback !== undefined - ? callback - : _cb; - - if (typeof cb !== 'function') { - throw TypeError('callback argument must be a function'); - } - - if (this._closed) { - process.nextTick(cb); - return; - } - - this._closed = true; - - var calledBack = false; - var nodeIds = Object.keys(this._nodes); - var waitingClose = 0; - - function onEnd(err) { - if (!calledBack && (err || --waitingClose <= 0)) { - calledBack = true; - cb(err); - } - } - - for (var i = 0; i < nodeIds.length; i++) { - var nodeId = nodeIds[i]; - var node = this._nodes[nodeId]; - - waitingClose++; - node.pool.end(onEnd); - } - - if (waitingClose === 0) { - process.nextTick(onEnd); - } -}; - -PoolCluster.prototype.of = function(pattern, selector) { - pattern = pattern || '*'; - - selector = selector || this._defaultSelector; - selector = selector.toUpperCase(); - if (typeof PoolSelector[selector] === 'undefined') { - selector = this._defaultSelector; - } - - var key = pattern + selector; - - if (typeof this._namespaces[key] === 'undefined') { - this._namespaces[key] = new PoolNamespace(this, pattern, selector); - } - - return this._namespaces[key]; -}; - -PoolCluster.prototype.remove = function remove(pattern) { - var foundNodeIds = this._findNodeIds(pattern, true); - - for (var i = 0; i < foundNodeIds.length; i++) { - var node = this._getNode(foundNodeIds[i]); - - if (node) { - this._removeNode(node); - } - } -}; - -PoolCluster.prototype.getConnection = function(pattern, selector, cb) { - var namespace; - if (typeof pattern === 'function') { - cb = pattern; - namespace = this.of(); - } else { - if (typeof selector === 'function') { - cb = selector; - selector = this._defaultSelector; - } - - namespace = this.of(pattern, selector); - } - - namespace.getConnection(cb); -}; - -PoolCluster.prototype._clearFindCaches = function _clearFindCaches() { - this._findCaches = Object.create(null); -}; - -PoolCluster.prototype._decreaseErrorCount = function _decreaseErrorCount(node) { - var errorCount = node.errorCount; - - if (errorCount > this._removeNodeErrorCount) { - errorCount = this._removeNodeErrorCount; - } - - if (errorCount < 1) { - errorCount = 1; - } - - node.errorCount = errorCount - 1; - - if (node._offlineUntil) { - node._offlineUntil = 0; - this.emit('online', node.id); - } -}; - -PoolCluster.prototype._findNodeIds = function _findNodeIds(pattern, includeOffline) { - var currentTime = 0; - var foundNodeIds = this._findCaches[pattern]; - - if (foundNodeIds === undefined) { - var expression = patternRegExp(pattern); - var nodeIds = Object.keys(this._nodes); - - foundNodeIds = nodeIds.filter(function (id) { - return id.match(expression); - }); - - this._findCaches[pattern] = foundNodeIds; - } - - if (includeOffline) { - return foundNodeIds; - } - - return foundNodeIds.filter(function (nodeId) { - var node = this._getNode(nodeId); - - if (!node._offlineUntil) { - return true; - } - - if (!currentTime) { - currentTime = getMonotonicMilliseconds(); - } - - return node._offlineUntil <= currentTime; - }, this); -}; - -PoolCluster.prototype._getNode = function _getNode(id) { - return this._nodes[id] || null; -}; - -PoolCluster.prototype._increaseErrorCount = function _increaseErrorCount(node) { - var errorCount = ++node.errorCount; - - if (this._removeNodeErrorCount > errorCount) { - return; - } - - if (this._restoreNodeTimeout > 0) { - node._offlineUntil = getMonotonicMilliseconds() + this._restoreNodeTimeout; - this.emit('offline', node.id); - return; - } - - this._removeNode(node); - this.emit('remove', node.id); -}; - -PoolCluster.prototype._getConnection = function(node, cb) { - var self = this; - - node.pool.getConnection(function (err, connection) { - if (err) { - self._increaseErrorCount(node); - cb(err); - return; - } else { - self._decreaseErrorCount(node); - } - - connection._clusterId = node.id; - - cb(null, connection); - }); -}; - -PoolCluster.prototype._removeNode = function _removeNode(node) { - delete this._nodes[node.id]; - - this._clearFindCaches(); - - node.pool.end(_noop); -}; - -function getMonotonicMilliseconds() { - var ms; - - if (typeof process.hrtime === 'function') { - ms = process.hrtime(); - ms = ms[0] * 1e3 + ms[1] * 1e-6; - } else { - ms = process.uptime() * 1000; - } - - return Math.floor(ms); -} - -function isRegExp(val) { - return typeof val === 'object' - && Object.prototype.toString.call(val) === '[object RegExp]'; -} - -function patternRegExp(pattern) { - if (isRegExp(pattern)) { - return pattern; - } - - var source = pattern - .replace(/([.+?^=!:${}()|\[\]\/\\])/g, '\\$1') - .replace(/\*/g, '.*'); - - return new RegExp('^' + source + '$'); -} - -function _cb(err) { - if (err) { - throw err; - } -} - -function _noop() {} - - -/***/ }), -/* 85 */ -/***/ (function(module, exports, __webpack_require__) { - -var Connection = __webpack_require__(8); -var PoolSelector = __webpack_require__(30); - -module.exports = PoolNamespace; - -/** - * PoolNamespace - * @constructor - * @param {PoolCluster} cluster The parent cluster for the namespace - * @param {string} pattern The selection pattern to use - * @param {string} selector The selector name to use - * @public - */ -function PoolNamespace(cluster, pattern, selector) { - this._cluster = cluster; - this._pattern = pattern; - this._selector = new PoolSelector[selector](); -} - -PoolNamespace.prototype.getConnection = function(cb) { - var clusterNode = this._getClusterNode(); - var cluster = this._cluster; - var namespace = this; - - if (clusterNode === null) { - var err = null; - - if (this._cluster._findNodeIds(this._pattern, true).length !== 0) { - err = new Error('Pool does not have online node.'); - err.code = 'POOL_NONEONLINE'; - } else { - err = new Error('Pool does not exist.'); - err.code = 'POOL_NOEXIST'; - } - - cb(err); - return; - } - - cluster._getConnection(clusterNode, function(err, connection) { - var retry = err && cluster._canRetry - && cluster._findNodeIds(namespace._pattern).length !== 0; - - if (retry) { - namespace.getConnection(cb); - return; - } - - if (err) { - cb(err); - return; - } - - cb(null, connection); - }); -}; - -PoolNamespace.prototype.query = function (sql, values, cb) { - var cluster = this._cluster; - var clusterNode = this._getClusterNode(); - var query = Connection.createQuery(sql, values, cb); - var namespace = this; - - if (clusterNode === null) { - var err = null; - - if (this._cluster._findNodeIds(this._pattern, true).length !== 0) { - err = new Error('Pool does not have online node.'); - err.code = 'POOL_NONEONLINE'; - } else { - err = new Error('Pool does not exist.'); - err.code = 'POOL_NOEXIST'; - } - - process.nextTick(function () { - query.on('error', function () {}); - query.end(err); - }); - return query; - } - - if (!(typeof sql === 'object' && 'typeCast' in sql)) { - query.typeCast = clusterNode.pool.config.connectionConfig.typeCast; - } - - if (clusterNode.pool.config.connectionConfig.trace) { - // Long stack trace support - query._callSite = new Error(); - } - - cluster._getConnection(clusterNode, function (err, conn) { - var retry = err && cluster._canRetry - && cluster._findNodeIds(namespace._pattern).length !== 0; - - if (retry) { - namespace.query(query); - return; - } - - if (err) { - query.on('error', function () {}); - query.end(err); - return; - } - - // Release connection based off event - query.once('end', function() { - conn.release(); - }); - - conn.query(query); - }); - - return query; -}; - -PoolNamespace.prototype._getClusterNode = function _getClusterNode() { - var foundNodeIds = this._cluster._findNodeIds(this._pattern); - var nodeId; - - switch (foundNodeIds.length) { - case 0: - nodeId = null; - break; - case 1: - nodeId = foundNodeIds[0]; - break; - default: - nodeId = this._selector(foundNodeIds); - break; - } - - return nodeId !== null - ? this._cluster._getNode(nodeId) - : null; -}; - - -/***/ }), -/* 86 */ -/***/ (function(module, exports, __webpack_require__) { - -const fs = __webpack_require__(20); - -class Logger { - constructor(output) { - this.output = output; - this.fileStream = null; - if (this.output === 'file' || this.output === 'both') { - this.fileStream = fs.createWriteStream('./mysql-async.log'); - } - this.writeConsole = msg => console.log(msg); - } - - writeFile(msg) { - this.fileStream.write(`${msg}\n`); - } - - log(msg) { - switch (this.output) { - default: - case 'console': - this.writeConsole(msg); - break; - case 'file': - this.writeFile(msg); - break; - case 'both': - this.writeConsole(msg); - this.writeFile(msg); - break; - } - } - - error(msg) { - let errorMsg = msg; - if (this.output !== 'file') { - errorMsg = `\x1b[31m${msg}\x1b[0m`; - } - this.log(errorMsg); - } -} - -module.exports = Logger; - - -/***/ }), -/* 87 */ -/***/ (function(module, exports) { - -const profilerDefaultConfig = { - trace: false, - slowQueryWarningTime: 100, - slowestQueries: 21, - timeInterval: 300000, -}; - -function updateExecutionTimes(object, queryTime) { - let returnObj = null; - - if (object) { - const { totalExecutionTime, queryCount } = object; - - returnObj = { - totalExecutionTime: totalExecutionTime + queryTime, - queryCount: queryCount + 1, - }; - } else { - returnObj = { - totalExecutionTime: queryTime, - queryCount: 1, - }; - } - - return returnObj; -} - -class Profiler { - constructor(logger, config) { - this.version = 'MySQL'; - this.startTime = Date.now(); - this.logger = logger; - this.config = Object.assign({}, profilerDefaultConfig, config); - this.profiles = { - executionTimes: [], - resources: {}, - slowQueries: [], - }; - this.slowQueryLimit = 0; - } - - get getFastestSlowQuery() { - return this.profiles.slowQueries.reduce((acc, cur) => ((cur < acc) ? cur : acc)); - } - - addSlowQuery(sql, resource, queryTime) { - this.profiles.slowQueries.push({ sql, resource, queryTime }); - if (this.profiles.slowQueries.length > this.config.slowestQueries) { - const min = this.getFastestSlowQuery; - this.profiles.slowQueries = this.profiles.slowQueries.filter(el => el !== min); - this.slowQueryLimit = this.getFastestSlowQuery; - } - } - - setVersion(version) { - this.version = version; - } - - fillExecutionTimes(interval) { - for (let i = 0; i < interval; i += 1) { - if (!this.profiles.executionTimes[i]) { - this.profiles.executionTimes[i] = { - totalExecutionTime: 0, - queryCount: 0, - }; - } - } - } - - profile(time, sql, resource) { - const interval = Math.floor((Date.now() - this.startTime) / this.config.timeInterval); - const queryTime = time[0] * 1e3 + time[1] * 1e-6; - - this.profiles.resources[resource] = updateExecutionTimes( - this.profiles.resources[resource], queryTime, - ); - this.profiles.executionTimes[interval] = updateExecutionTimes( - this.profiles.executionTimes[interval], queryTime, - ); - // fix execution times manually - this.fillExecutionTimes(interval); - // todo: cull old intervals - - if (this.slowQueryLimit < queryTime) { - this.addSlowQuery(sql, resource, queryTime); - } - - if (this.slowQueryWarningTime < queryTime) { - this.logger.error(`[${this.version}] [Slow Query Warning] [${resource}] [${queryTime.toFixed()}ms] ${sql}`); - } - - if (this.config.trace) { - this.logger.log(`[${this.version}] [${resource}] [${queryTime.toFixed()}ms] ${sql}`); - } - } -} - -module.exports = Profiler; - - -/***/ }), -/* 88 */ -/***/ (function(module, exports, __webpack_require__) { - -const { parseUrl } = __webpack_require__(9); - -const defaultCfg = { - host: '127.0.0.1', - user: 'root', - database: 'fivem', - supportBigNumbers: true, - multipleStatements: true, -}; - - -function parseConnectingString(connectionString) { - let cfg = {}; - if (/(?:database|initial\scatalog)=(?:(.*?);|(.*))/gi.test(connectionString)) { - // replace the old version with the new one - const connectionStr = connectionString - .replace(/(?:host|server|data\s?source|addr(?:ess)?)=/gi, 'host=') - .replace(/(?:port)=/gi, 'port=') - .replace(/(?:user\s?(?:id|name)?|uid)=/gi, 'user=') - .replace(/(?:password|pwd)=/gi, 'password=') - .replace(/(?:database|initial\scatalog)=/gi, 'database='); - connectionStr.split(';').forEach((el) => { - const equal = el.indexOf('='); - const key = (equal > -1) ? el.substr(0, equal) : el; - const value = (equal > -1) ? el.substr(equal + 1) : ''; - cfg[key] = value; - }); - } else if (/mysql:\/\//gi.test(connectionString)) { - cfg = parseUrl(connectionString); - } else throw new Error('No valid connection string found'); - - return Object.assign({}, defaultCfg, cfg); -} - -module.exports = parseConnectingString; - - -/***/ }), -/* 89 */ -/***/ (function(module, exports, __webpack_require__) { - -const mysql = __webpack_require__(12); - -function safeInvoke(callback, args) { - if (typeof callback === 'function') { - setImmediate(() => { - callback(args); - }); - } -} - -function mysqlEscape(parameters, text, key) { - let result = text; - if (Object.prototype.hasOwnProperty.call(parameters, key)) { - result = mysql.escape(parameters[key]); - } else if (Object.prototype.hasOwnProperty.call(parameters, text)) { - result = mysql.escape(parameters[text]); - } - return result; -} - -function prepareQuery(query, parameters) { - let sql = query; - if (parameters !== null && typeof parameters === 'object') { - sql = query.replace(/@(\w+)/g, (txt, key) => mysqlEscape(parameters, txt, key)); - } - return sql; -} - -function typeCast(field, next) { - let dateString = ''; - switch (field.type) { - case 'DATETIME': - case 'DATETIME2': - case 'TIMESTAMP': - case 'TIMESTAMP2': - case 'NEWDATE': - case 'DATE': - dateString = field.string(); - if (field.type === 'DATE') dateString += ' 00:00:00'; - return (new Date(dateString)).getTime(); - case 'TINY': - if (field.length === 1) { - return (field.string() !== '0'); - } - return next(); - case 'BIT': - return Number(field.buffer()[0]); - default: - return next(); - } -} - -function prepareTransactionLegacyQuery(querys) { - const sqls = querys; - sqls.forEach((element, index) => { - const query = prepareQuery(element.query, element.parameters); - sqls[index] = query; - }); - return sqls; -} - -function sanitizeTransactionInput(querys, params, callback) { - let sqls = []; - let cb = callback; - // if every query is a string we are dealing with syntax type a - if (!querys.every(element => typeof element === 'string')) sqls = querys; - else { - const values = (typeof params === 'function') ? [] : params; - querys.forEach((element) => { - sqls.push({ query: element, parameters: values }); - }); - } - if (typeof params === 'function') cb = params; - sqls = prepareTransactionLegacyQuery(sqls); - return [sqls, cb]; -} - -module.exports = { - safeInvoke, prepareQuery, typeCast, sanitizeTransactionInput, -}; - - -/***/ }) -/******/ ]); \ No newline at end of file diff --git a/mysql-async/src/mysql.js b/mysql-async/src/mysql.js deleted file mode 100644 index 29c9d111..00000000 --- a/mysql-async/src/mysql.js +++ /dev/null @@ -1,139 +0,0 @@ -const mysql = require('mysql'); - -let config = {}; -let debug = 0; -let pool; - -function prepareQuery(query, parameters) { - let sql = query; - if (parameters !== null && typeof parameters === 'object') { - sql = query.replace(/@(\w+)/g, (txt, key) => { - if (parameters.hasOwnProperty(key)) { - return mysql.escape(parameters[key]); - } else if (parameters.hasOwnProperty(`@${key}`)) { - return mysql.escape(parameters[`@${key}`]); - } - return txt; - }); - } - return sql; -} - -function writeDebug(time, sql, error) { - if (error) console.log(`[ERROR] [MySQL] An error happens on MySQL for query "${sql}": ${error.message}`) - if (debug) console.log(`[MySQL] [${(time[0]*1e3+time[1]*1e-6).toFixed()}ms] ${sql}`); -} - -async function safeInvoke(callback, args) { - if (typeof callback === 'function') setImmediate(() => { - callback(args); - }); -} - -// transform tinyint(1) to boolean -function useBoolean(fields, results) { - if (fields) { - fields.forEach(field => { - // found a column with tinyint(1) - if (field.type === 1 && field.length === 1) { - results.forEach((_, index) => { - results[index][field.name] = (results[index][field.name] !== 0); - }); - } - }); - } - return results; -} - -global.exports('mysql_execute', (query, parameters, callback) => { - let sql = prepareQuery(query, parameters); - let start = process.hrtime(); - pool.query(sql, (error, results) => { - writeDebug(process.hrtime(start), sql, error); - safeInvoke(callback, (results) ? results.affectedRows : 0); - }); -}); - -global.exports('mysql_fetch_all', (query, parameters, callback) => { - let sql = prepareQuery(query, parameters); - let start = process.hrtime(); - pool.query(sql, (error, results, fields) => { - writeDebug(process.hrtime(start), sql, error); - results = useBoolean(fields, results); - safeInvoke(callback, results); - }); -}); - -global.exports('mysql_fetch_scalar', (query, parameters, callback) => { - let sql = prepareQuery(query, parameters); - let start = process.hrtime(); - pool.query(sql, (error, results, fields) => { - writeDebug(process.hrtime(start), sql, error); - results = useBoolean(fields, results); - safeInvoke(callback, (results) ? Object.values(results[0])[0] : null); - }); -}); - -global.exports('mysql_insert', (query, parameters, callback) => { - let sql = prepareQuery(query, parameters); - let start = process.hrtime(); - pool.query(sql, (error, results) => { - writeDebug(process.hrtime(start), sql, error); - safeInvoke(callback, (results) ? results.insertId : 0); - }); -}); - -function parseOptions(config, options) { - const cfg = config; - const opts = options.split('&'); - opts.forEach((o) => { - const keyValue = o.split('='); - cfg[keyValue[0]] = keyValue[1]; - }); - return cfg; -} - -function parseConnectingString(connectionString) { - if(/(?:database|initial\scatalog)=(?:(.*?);|(.*))/gi.test(connectionString)) { - - let matches = (/(?:host|server|data\s?source|addr(?:ess)?)=(?:(.*?);|(.*))/gi.exec(connectionString)); - const host = (matches) ? matches[1] || matches[2] : 'localhost'; - matches = (/(?:Port)=(?:(.*?);|(.*))/gi.exec(connectionString)); - const port = (matches) ? matches[1] || matches[2] : 3306; - matches = (/(?:user\s?(?:id|name)?|uid)=(?:(.*?);|(.*))/gi.exec(connectionString)); - const user = (matches) ? matches[1] || matches[2] : 'root'; - matches = (/(?:password|pwd)=(?:(.*?);|(.*))/gi.exec(connectionString)); - const password = (matches) ? matches[1] || matches[2] : ''; - matches = (/(?:database|initial\scatalog)=(?:(.*?);|(.*))/gi.exec(connectionString)); - const database = (matches) ? matches[1] || matches[2] : ''; - return { host, port, user, password, database, dateStrings: true }; - - } else if(/mysql:\/\//gi.test(connectionString)) { - - let matches = /mysql:\/\/(.*?)(?::|@)(?:(.*)@)?(.*?)(?::(\d{1,5}))?\/(.*?)\?(.*)/gi.exec(connectionString); - const host = (matches[3]) ? matches[3] : 'localhost'; - const port = (matches[4]) ? matches[4] : 3306; - const user = (matches[1]) ? matches[1] : 'root'; - const password = (matches[2]) ? matches[2] : ''; - const database = (matches[5]) ? matches[5] : ''; - const config = { host, port, user, password, database }; - const options = matches[6]; - return parseOptions(config, options); - - } else throw new Error('No valid connection string found'); -} - -let isReady = false; -global.on('onServerResourceStart', (resourcename) => { - if (resourcename == 'mysql-async') { - const connectionString = global.GetConvar('mysql_connection_string', 'mysql://localhost/'); - config = parseConnectingString(connectionString); - debug = global.GetConvarInt('mysql_debug', 0); - pool = mysql.createPool(config); - global.emit('onMySQLReady'); // avoid ESX bugs - isReady = true; - } - if (isReady) { - global.emit('MySQLReady'); // avoid ESX bugs - } -}); diff --git a/mysql-async/src/package.json b/mysql-async/src/package.json deleted file mode 100644 index 74cc3c87..00000000 --- a/mysql-async/src/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "mysql-async", - "version": "3.0.1", - "description": "fivem-mysql-async", - "private": true, - "scripts": { - "build": "webpack" - }, - "contributors": [ - "Joel Wurtz", - "Matthias Mandelartz" - ], - "license": "MIT", - "dependencies": { - "mysql": "^2.16.0" - }, - "devDependencies": { - "eslint": "^5.6.0", - "webpack": "^4.19.0", - "webpack-cli": "^3.1.0" - } -} diff --git a/mysql-async/src/webpack.config.js b/mysql-async/src/webpack.config.js deleted file mode 100644 index 479cd28d..00000000 --- a/mysql-async/src/webpack.config.js +++ /dev/null @@ -1,14 +0,0 @@ -const path = require('path'); - -module.exports = { - entry: './mysql.js', - target: 'node', - mode: 'production', - output: { - filename: 'mysql-async.js', - path: path.resolve(__dirname, '..'), - }, - optimization: { - minimize: false, - }, -}; diff --git a/readME.md b/readME.md index 908f504a..e1508f0c 100644 --- a/readME.md +++ b/readME.md @@ -1,145 +1,13 @@ -# Thanks You KASH (github.com/KASHZIN)Who The Original Develop This ESX_KASHACTERS RELEASE And To XxFri3ndlyxX (github.com/XxFri3ndlyxX) +# Thanks to KASH and XxFri3ndlyxX -**this tutorial i made original a little bit use XxFri3ndlyxX tutorial :v** - -**_How To Install and fix bug esx_kashacters** - -Change Log : -esx_ambulancejob : Fixed The Bug When You Die And You Reconnect And You still alive with your item ! - -- Step One [ essentialmode\client\main.lua ] - -Delete Or Replace This ! - -``` ---[[Citizen.CreateThread(function() - while true do - Citizen.Wait(0) - - if NetworkIsSessionStarted() then - TriggerServerEvent('es:firstJoinProper') - TriggerEvent('es:allowedToSpawn') - return - end - end -end)]]-- -``` - -- Step Two [ es_extended [ LINE : 457 ] client/main.lua ] -This To Fix Cant Open Inventory When You Die And Get Revived - -Change You Menu interactions to this ! - - ``` - ---Menu interactions -Citizen.CreateThread(function() - while true do - - Citizen.Wait(0) - - if IsControlJustReleased(0, 289) and IsInputDisabled(0) and not ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then - ESX.ShowInventory() - end - - end -end) -``` - -- Step Three -To Get Your esx_kashacters work you need do this on your query if you wan to check what is the owner and identifier tables - -```SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner' -And This -SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'identifier' -Credit @Xnubil``` - -- Step four [Fix Datastore] -Duplicate Your esx_datastore or add This line on your esx_datastore server\main.lua - -```-- Fix was taken from this link -- --- https://forum.fivem.net/t/release-esx-kashacters-multi-character/251613/448?u=xxfri3ndlyxx -- -AddEventHandler('esx:playerLoaded', function(source) - - local result = MySQL.Sync.fetchAll('SELECT * FROM datastore') - - for i=1, #result, 1 do - local name = result[i].name - local label = result[i].label - local shared = result[i].shared - - local result2 = MySQL.Sync.fetchAll('SELECT * FROM datastore_data WHERE name = @name', { - ['@name'] = name - }) - - if shared == 0 then - - table.insert(DataStoresIndex, name) - DataStores[name] = {} - - for j=1, #result2, 1 do - local storeName = result2[j].name - local storeOwner = result2[j].owner - local storeData = (result2[j].data == nil and {} or json.decode(result2[j].data)) - local dataStore = CreateDataStore(storeName, storeOwner, storeData) - - table.insert(DataStores[name], dataStore) - end - end - end - - local _source = source - local xPlayer = ESX.GetPlayerFromId(_source) - local dataStores = {} - - for i=1, #DataStoresIndex, 1 do - local name = DataStoresIndex[i] - local dataStore = GetDataStore(name, xPlayer.identifier) - - if dataStore == nil then - MySQL.Async.execute('INSERT INTO datastore_data (name, owner, data) VALUES (@name, @owner, @data)', - { - ['@name'] = name, - ['@owner'] = xPlayer.identifier, - ['@data'] = '{}' - }) - - dataStore = CreateDataStore(name, xPlayer.identifier, {}) - table.insert(DataStores[name], dataStore) - end - - table.insert(dataStores, dataStore) - end - - xPlayer.set('dataStores', dataStores) -end) -``` - -Download Link : https://github.com/XxFri3ndlyxX/esx_datastore -Credits : https://github.com/XxFri3ndlyxX - -- Step Five [ Fix Ambulance Or Spawn ] -This To Fix Die Tele And When Your Get Revived You Cant Open any Menu only F2 -Or Just Download My File the esx_ambulancejob (or download the lastest version esx_ambulancejob :v) - -- Step Six [ Fix your esx_kashacters identifier ] -Download My mysql-async And start on your server.cfg - -- Step Seven [ Fix Your Identifier And Spawn] -Download My esx_kashacters Modified And start on your server.cfg -Thats All Identifier [esx_kashacters\server\main.lua] maybe thats all -you need in Roleplay Server if you wan to change just change it - -- Step Eight [ Fix F6 Can Open Menu ] -try to delete IsDie in the police and mechanic Menu -https://github.com/EbenSantuy/esx_kashacter-TUTORIAL-FIXED-ALL-ISSUE/issues/1#issuecomment-520927465 - -===--------------------------------------------------------------------=== - -# OkeyThats All Make My esx_kashacters work properly if you wanna ask -# My Discord : Blue.#5108 - -# Thank you Again to KASH And XxFri3ndlyxX ! :) -# ENJOY YOUR ESX_KASHACTERS +## Required changes: +* es_extended: + * `es_extended/client/main.lua` +Change `AddEventHandler('playerSpawned', function()` (35) to: +```lua +RegisterNetEvent('esx:kashloaded') +AddEventHandler('esx:kashloaded', function() +``` \ No newline at end of file From e6bcd0560ab664744616bfa355d133bfa2fb2413 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 14:58:56 +0100 Subject: [PATCH 019/205] Update and rename readME.md to readme.md --- readME.md => readme.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) rename readME.md => readme.md (53%) diff --git a/readME.md b/readme.md similarity index 53% rename from readME.md rename to readme.md index e1508f0c..775f67a8 100644 --- a/readME.md +++ b/readme.md @@ -2,12 +2,11 @@ ## Required changes: -* es_extended: - * `es_extended/client/main.lua` +* es_extended: (`es_extended/client/main.lua`) -Change `AddEventHandler('playerSpawned', function()` (35) to: +Replace `AddEventHandler('playerSpawned', function()` (35) with: ```lua RegisterNetEvent('esx:kashloaded') AddEventHandler('esx:kashloaded', function() -``` \ No newline at end of file +``` From 9c78cfa1331e162b9f077104bb3a7a8afa5e2ae7 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 15:00:46 +0100 Subject: [PATCH 020/205] Update main.lua --- esx_kashacters/client/main.lua | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/esx_kashacters/client/main.lua b/esx_kashacters/client/main.lua index ae01ea31..e2c181e8 100644 --- a/esx_kashacters/client/main.lua +++ b/esx_kashacters/client/main.lua @@ -31,8 +31,10 @@ Citizen.CreateThread(function () end end end) + local cam = nil local cam2 = nil + RegisterNetEvent('kashactersC:SetupCharacters') AddEventHandler('kashactersC:SetupCharacters', function() DoScreenFadeOut(10) @@ -59,39 +61,49 @@ end) RegisterNetEvent('kashactersC:SpawnCharacter') AddEventHandler('kashactersC:SpawnCharacter', function(spawn, isnew) - TriggerServerEvent('es:firstJoinProper') - TriggerEvent('es:allowedToSpawn') SetTimecycleModifier('default') + local pos = spawn + SetEntityCoords(GetPlayerPed(-1), pos.x, pos.y, pos.z) DoScreenFadeIn(500) + Citizen.Wait(500) + cam2 = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", -1355.93,-1487.78,520.75, 300.00,0.00,0.00, 100.00, false, 0) PointCamAtCoord(cam2, pos.x,pos.y,pos.z+200) SetCamActiveWithInterp(cam2, cam, 900, true, true) + Citizen.Wait(900) + exports.spawnmanager:setAutoSpawn(false) - TriggerEvent('esx_ambulancejob:multicharacter', source) - - if isnew then - TriggerEvent('esx_identity:showRegisterIdentity') - end cam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", pos.x,pos.y,pos.z+200, 300.00,0.00,0.00, 100.00, false, 0) PointCamAtCoord(cam, pos.x,pos.y,pos.z+2) SetCamActiveWithInterp(cam, cam2, 3700, true, true) + Citizen.Wait(3700) + PlaySoundFrontend(-1, "Zoom_Out", "DLC_HEIST_PLANNING_BOARD_SOUNDS", 1) RenderScriptCams(false, true, 500, true, true) PlaySoundFrontend(-1, "CAR_BIKE_WHOOSH", "MP_LOBBY_SOUNDS", 1) FreezeEntityPosition(GetPlayerPed(-1), false) + Citizen.Wait(500) + SetCamActive(cam, false) DestroyCam(cam, true) IsChoosing = false DisplayHud(true) DisplayRadar(true) + + TriggerEvent('esx:kashloaded') + + if isnew then + TriggerEvent('esx_identity:showRegisterIdentity') + end + end) RegisterNetEvent('kashactersC:ReloadCharacters') @@ -109,6 +121,7 @@ RegisterNUICallback("CharacterChosen", function(data, cb) end cb("ok") end) + RegisterNUICallback("DeleteCharacter", function(data, cb) SetNuiFocus(false,false) DoScreenFadeOut(500) From f2612dc87220f84a9119919365b37032d516130f Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 15:04:26 +0100 Subject: [PATCH 021/205] Add support for latest ESX (2/2) --- esx_kashacters/server/main.lua | 39 +++++++++++++--------------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index 388a363a..7401cd69 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -3,25 +3,16 @@ -- where identifiers are used (such as users, owned_vehicles, owned_properties etc.) --------------------------------------------------------------------------------------- local IdentifierTables = { - {table = "users", column = "identifier"}, - {table = "user_accounts", column = "identifier"}, - -- {table = "user_contacts", column = "identifier"}, - {table = "user_inventory", column = "identifier"}, - -- {table = "user_parkings", column = "identifier"}, - {table = "society_moneywash", column = "identifier"}, - {table = "phone_users_contacts", column = "identifier"}, - --{table = "jail", column = "identifier"}, - {table = "characters", column = "identifier"}, - {table = "billing", column = "identifier"}, - {table = "rented_vehicles", column = "owner"}, {table = "addon_account_data", column = "owner"}, {table = "addon_inventory_items", column = "owner"}, - {table = "datastore_data", column = "owner"}, - {table = "owned_vehicles", column = "owner"}, - {table = "phone_calls", column = "owner"}, - {table = "phone_messages", column = "owner"}, - {table = "rented_vehicles", column = "owner"}, - {table = "user_licenses", column = "owner"}, + {table = "billing", column = "identifier"}, + {table = "datastore_data", column = "owner"}, + {table = "owned_vehicles", column = "owner"}, + {table = "owned_properties", column = "owner"}, + {table = "rented_vehicles", column = "owner"}, + {table = "users", column = "identifier"}, + {table = "user_accounts", column = "identifier"}, + {table = "user_licenses", column = "owner"}, } RegisterServerEvent("kashactersS:SetupCharacters") @@ -42,7 +33,7 @@ AddEventHandler('kashactersS:CharacterChosen', function(charid, ischar) if ischar == "true" then spawn = GetSpawnPos(src) else - TriggerClientEvent('skinchanger:loadDefaultModel', src, true, cb) + TriggerClientEvent('skinchanger:loadDefaultModel', src, true, cb) spawn = { x = 195.55, y = -933.36, z = 29.90 } -- DEFAULT SPAWN POSITION end TriggerClientEvent("kashactersC:SpawnCharacter", src, spawn) @@ -56,7 +47,7 @@ AddEventHandler('kashactersS:DeleteCharacter', function(charid) end) function GetPlayerCharacters(source) - local identifier = GetIdentifierWithoutSteam(GetPlayerIdentifiers(source)[1]) + local identifier = GetIdentifierWithoutLicense(GetPlayerIdentifiers(source)[1]) local Chars = MySQLAsyncExecute("SELECT * FROM `users` WHERE identifier LIKE '%"..identifier.."%'") for i = 1, #Chars, 1 do charJob = MySQLAsyncExecute("SELECT * FROM `jobs` WHERE `name` = '"..Chars[i].job.."'") @@ -83,19 +74,19 @@ end function SetIdentifierToChar(identifier, charid) for _, itable in pairs(IdentifierTables) do - MySQLAsyncExecute("UPDATE `"..itable.table.."` SET `"..itable.column.."` = 'Char"..charid..GetIdentifierWithoutSteam(identifier).."' WHERE `"..itable.column.."` = '"..identifier.."'") + MySQLAsyncExecute("UPDATE `"..itable.table.."` SET `"..itable.column.."` = 'Char"..charid..GetIdentifierWithoutLicense(identifier).."' WHERE `"..itable.column.."` = '"..identifier.."'") end end function SetCharToIdentifier(identifier, charid) for _, itable in pairs(IdentifierTables) do - MySQLAsyncExecute("UPDATE `"..itable.table.."` SET `"..itable.column.."` = '"..identifier.."' WHERE `"..itable.column.."` = 'Char"..charid..GetIdentifierWithoutSteam(identifier).."'") + MySQLAsyncExecute("UPDATE `"..itable.table.."` SET `"..itable.column.."` = '"..identifier.."' WHERE `"..itable.column.."` = 'Char"..charid..GetIdentifierWithoutLicense(identifier).."'") end end function DeleteCharacter(identifier, charid) for _, itable in pairs(IdentifierTables) do - MySQLAsyncExecute("DELETE FROM `"..itable.table.."` WHERE `"..itable.column.."` = 'Char"..charid..GetIdentifierWithoutSteam(identifier).."'") + MySQLAsyncExecute("DELETE FROM `"..itable.table.."` WHERE `"..itable.column.."` = 'Char"..charid..GetIdentifierWithoutLicense(identifier).."'") end end @@ -104,8 +95,8 @@ function GetSpawnPos(source) return json.decode(SpawnPos[1].position) end -function GetIdentifierWithoutSteam(Identifier) - return string.gsub(Identifier, "steam", "") +function GetIdentifierWithoutLicense(Identifier) + return string.gsub(Identifier, "license", "") end function MySQLAsyncExecute(query) From 2d63e61e32f652d122ec83427ee6b0b742c2aa2b Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 15:10:26 +0100 Subject: [PATCH 022/205] Update and rename __resource.lua to fxmanifest.lua --- esx_kashacters/{__resource.lua => fxmanifest.lua} | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) rename esx_kashacters/{__resource.lua => fxmanifest.lua} (78%) diff --git a/esx_kashacters/__resource.lua b/esx_kashacters/fxmanifest.lua similarity index 78% rename from esx_kashacters/__resource.lua rename to esx_kashacters/fxmanifest.lua index f54f029c..4a1064b0 100644 --- a/esx_kashacters/__resource.lua +++ b/esx_kashacters/fxmanifest.lua @@ -1,4 +1,6 @@ -resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' +fx_version 'adamant' + +game 'gta5' server_scripts { "@mysql-async/lib/MySQL.lua", @@ -12,8 +14,11 @@ client_scripts { ui_page { 'html/ui.html', } + files { 'html/ui.html', 'html/css/main.css', 'html/js/app.js', } + +dependency 'es_extended' From acd4e30feae5df37b5064b977cf991d200aa6511 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 15:41:38 +0100 Subject: [PATCH 023/205] Fix GetPlayerIdentifiers --- esx_kashacters/server/main.lua | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index 7401cd69..9a701965 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -18,8 +18,10 @@ local IdentifierTables = { RegisterServerEvent("kashactersS:SetupCharacters") AddEventHandler('kashactersS:SetupCharacters', function() local src = source + local xPlayer = ESX.GetPlayerFromId(rc) local LastCharId = GetLastCharacter(src) - SetIdentifierToChar(GetPlayerIdentifiers(src)[1], LastCharId) + + SetIdentifierToChar(xPlayer.identifier, LastCharId) local Characters = GetPlayerCharacters(src) TriggerClientEvent('kashactersC:SetupUI', src, Characters) end) @@ -27,28 +29,34 @@ end) RegisterServerEvent("kashactersS:CharacterChosen") AddEventHandler('kashactersS:CharacterChosen', function(charid, ischar) local src = source + local xPlayer = ESX.GetPlayerFromId(src) local spawn = {} + SetLastCharacter(src, tonumber(charid)) - SetCharToIdentifier(GetPlayerIdentifiers(src)[1], tonumber(charid)) + SetCharToIdentifier(xPlayer.identifier, tonumber(charid)) + if ischar == "true" then spawn = GetSpawnPos(src) else TriggerClientEvent('skinchanger:loadDefaultModel', src, true, cb) spawn = { x = 195.55, y = -933.36, z = 29.90 } -- DEFAULT SPAWN POSITION end + TriggerClientEvent("kashactersC:SpawnCharacter", src, spawn) end) RegisterServerEvent("kashactersS:DeleteCharacter") AddEventHandler('kashactersS:DeleteCharacter', function(charid) local src = source - DeleteCharacter(GetPlayerIdentifiers(src)[1], charid) + local xPlayer = ESX.GetPlayerFromId(source) + DeleteCharacter(xPlayer.identifier, charid) TriggerClientEvent("kashactersC:ReloadCharacters", src) end) function GetPlayerCharacters(source) - local identifier = GetIdentifierWithoutLicense(GetPlayerIdentifiers(source)[1]) - local Chars = MySQLAsyncExecute("SELECT * FROM `users` WHERE identifier LIKE '%"..identifier.."%'") + local xPlayer = ESX.GetPlayerFromId(source) + + local Chars = MySQLAsyncExecute("SELECT * FROM `users` WHERE identifier LIKE '%"..xPlayer.identifier.."%'") for i = 1, #Chars, 1 do charJob = MySQLAsyncExecute("SELECT * FROM `jobs` WHERE `name` = '"..Chars[i].job.."'") charJobgrade = MySQLAsyncExecute("SELECT * FROM `job_grades` WHERE `grade` = '"..Chars[i].job_grade.."'") @@ -59,17 +67,20 @@ function GetPlayerCharacters(source) end function GetLastCharacter(source) - local LastChar = MySQLAsyncExecute("SELECT `charid` FROM `user_lastcharacter` WHERE `steamid` = '"..GetPlayerIdentifiers(source)[1].."'") + local xPlayer = ESX.GetPlayerFromId(source) + + local LastChar = MySQLAsyncExecute("SELECT `charid` FROM `user_lastcharacter` WHERE `steamid` = '"..xPlayer.identifier.."'") if LastChar[1] ~= nil and LastChar[1].charid ~= nil then return tonumber(LastChar[1].charid) else - MySQLAsyncExecute("INSERT INTO `user_lastcharacter` (`steamid`, `charid`) VALUES('"..GetPlayerIdentifiers(source)[1].."', 1)") + MySQLAsyncExecute("INSERT INTO `user_lastcharacter` (`steamid`, `charid`) VALUES('"..xPlayer.identifier.."', 1)") return 1 end end function SetLastCharacter(source, charid) - MySQLAsyncExecute("UPDATE `user_lastcharacter` SET `charid` = '"..charid.."' WHERE `steamid` = '"..GetPlayerIdentifiers(source)[1].."'") + local xPlayer = ESX.GetPlayerFromId(source) + MySQLAsyncExecute("UPDATE `user_lastcharacter` SET `charid` = '"..charid.."' WHERE `steamid` = '"..xPlayer.identifier.."'") end function SetIdentifierToChar(identifier, charid) @@ -91,7 +102,8 @@ function DeleteCharacter(identifier, charid) end function GetSpawnPos(source) - local SpawnPos = MySQLAsyncExecute("SELECT `position` FROM `users` WHERE `identifier` = '"..GetPlayerIdentifiers(source)[1].."'") + local xPlayer = ESX.GetPlayerFromId(source) + local SpawnPos = MySQLAsyncExecute("SELECT `position` FROM `users` WHERE `identifier` = '"..xPlayer.identifier.."'") return json.decode(SpawnPos[1].position) end From c22733bb4c9cbd53daa45ec23b7d1cf8b9040a16 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 15:41:58 +0100 Subject: [PATCH 024/205] Update main.lua --- esx_kashacters/server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index 9a701965..e12de84c 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -18,7 +18,7 @@ local IdentifierTables = { RegisterServerEvent("kashactersS:SetupCharacters") AddEventHandler('kashactersS:SetupCharacters', function() local src = source - local xPlayer = ESX.GetPlayerFromId(rc) + local xPlayer = ESX.GetPlayerFromId(src) local LastCharId = GetLastCharacter(src) SetIdentifierToChar(xPlayer.identifier, LastCharId) From 8171f9f48395550a3d842209524dcc46b5855ca3 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 15:42:40 +0100 Subject: [PATCH 025/205] Update main.lua --- esx_kashacters/server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index e12de84c..21c4e442 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -48,7 +48,7 @@ end) RegisterServerEvent("kashactersS:DeleteCharacter") AddEventHandler('kashactersS:DeleteCharacter', function(charid) local src = source - local xPlayer = ESX.GetPlayerFromId(source) + local xPlayer = ESX.GetPlayerFromId(src) DeleteCharacter(xPlayer.identifier, charid) TriggerClientEvent("kashactersC:ReloadCharacters", src) end) From ecf073ef612510d7a92f8e9bc239e443bf2f6882 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 15:54:12 +0100 Subject: [PATCH 026/205] Fix issues with identifiers... --- esx_kashacters/server/main.lua | 39 ++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index 21c4e442..c3a6e6f5 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -18,10 +18,9 @@ local IdentifierTables = { RegisterServerEvent("kashactersS:SetupCharacters") AddEventHandler('kashactersS:SetupCharacters', function() local src = source - local xPlayer = ESX.GetPlayerFromId(src) local LastCharId = GetLastCharacter(src) - SetIdentifierToChar(xPlayer.identifier, LastCharId) + SetIdentifierToChar(GetRockstarID(src), LastCharId) local Characters = GetPlayerCharacters(src) TriggerClientEvent('kashactersC:SetupUI', src, Characters) end) @@ -29,11 +28,10 @@ end) RegisterServerEvent("kashactersS:CharacterChosen") AddEventHandler('kashactersS:CharacterChosen', function(charid, ischar) local src = source - local xPlayer = ESX.GetPlayerFromId(src) local spawn = {} SetLastCharacter(src, tonumber(charid)) - SetCharToIdentifier(xPlayer.identifier, tonumber(charid)) + SetCharToIdentifier(GetRockstarID(src), tonumber(charid)) if ischar == "true" then spawn = GetSpawnPos(src) @@ -48,39 +46,36 @@ end) RegisterServerEvent("kashactersS:DeleteCharacter") AddEventHandler('kashactersS:DeleteCharacter', function(charid) local src = source - local xPlayer = ESX.GetPlayerFromId(src) - DeleteCharacter(xPlayer.identifier, charid) + DeleteCharacter(GetRockstarID(src), charid) TriggerClientEvent("kashactersC:ReloadCharacters", src) end) function GetPlayerCharacters(source) - local xPlayer = ESX.GetPlayerFromId(source) - - local Chars = MySQLAsyncExecute("SELECT * FROM `users` WHERE identifier LIKE '%"..xPlayer.identifier.."%'") + local Chars = MySQLAsyncExecute("SELECT * FROM `users` WHERE identifier LIKE '%"..GetRockstarID(source).."%'") + for i = 1, #Chars, 1 do charJob = MySQLAsyncExecute("SELECT * FROM `jobs` WHERE `name` = '"..Chars[i].job.."'") charJobgrade = MySQLAsyncExecute("SELECT * FROM `job_grades` WHERE `grade` = '"..Chars[i].job_grade.."'") Chars[i].job = charJob[1].label Chars[i].job_grade = charJobgrade[1].label end + return Chars end function GetLastCharacter(source) - local xPlayer = ESX.GetPlayerFromId(source) + local LastChar = MySQLAsyncExecute("SELECT `charid` FROM `user_lastcharacter` WHERE `steamid` = '"..GetRockstarID(source).."'") - local LastChar = MySQLAsyncExecute("SELECT `charid` FROM `user_lastcharacter` WHERE `steamid` = '"..xPlayer.identifier.."'") if LastChar[1] ~= nil and LastChar[1].charid ~= nil then return tonumber(LastChar[1].charid) else - MySQLAsyncExecute("INSERT INTO `user_lastcharacter` (`steamid`, `charid`) VALUES('"..xPlayer.identifier.."', 1)") + MySQLAsyncExecute("INSERT INTO `user_lastcharacter` (`steamid`, `charid`) VALUES('"..GetRockstarID(source).."', 1)") return 1 end end function SetLastCharacter(source, charid) - local xPlayer = ESX.GetPlayerFromId(source) - MySQLAsyncExecute("UPDATE `user_lastcharacter` SET `charid` = '"..charid.."' WHERE `steamid` = '"..xPlayer.identifier.."'") + MySQLAsyncExecute("UPDATE `user_lastcharacter` SET `charid` = '"..charid.."' WHERE `steamid` = '"..GetRockstarID(source).."'") end function SetIdentifierToChar(identifier, charid) @@ -102,8 +97,7 @@ function DeleteCharacter(identifier, charid) end function GetSpawnPos(source) - local xPlayer = ESX.GetPlayerFromId(source) - local SpawnPos = MySQLAsyncExecute("SELECT `position` FROM `users` WHERE `identifier` = '"..xPlayer.identifier.."'") + local SpawnPos = MySQLAsyncExecute("SELECT `position` FROM `users` WHERE `identifier` = '"..GetRockstarID(source).."'") return json.decode(SpawnPos[1].position) end @@ -111,6 +105,19 @@ function GetIdentifierWithoutLicense(Identifier) return string.gsub(Identifier, "license", "") end +function GetRockstarID(playerId) + local identifier + + for k,v in ipairs(GetPlayerIdentifiers(playerId)) do + if string.match(v, 'license:') then + identifier = string.sub(v, 9) + break + end + end + + return identifier +end + function MySQLAsyncExecute(query) local IsBusy = true local result = nil From eb2a274d70117409b20c205cc1010c9074395dc8 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 15:58:37 +0100 Subject: [PATCH 027/205] We need the entire identifier, string.sub is unnecessary. --- esx_kashacters/server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index c3a6e6f5..44f28f3b 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -110,7 +110,7 @@ function GetRockstarID(playerId) for k,v in ipairs(GetPlayerIdentifiers(playerId)) do if string.match(v, 'license:') then - identifier = string.sub(v, 9) + identifier = v break end end From 083b545300ba449ffd90196916968085c84dd045 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 16:12:40 +0100 Subject: [PATCH 028/205] Update main.lua --- esx_kashacters/server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index 44f28f3b..8b458cfa 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -51,7 +51,7 @@ AddEventHandler('kashactersS:DeleteCharacter', function(charid) end) function GetPlayerCharacters(source) - local Chars = MySQLAsyncExecute("SELECT * FROM `users` WHERE identifier LIKE '%"..GetRockstarID(source).."%'") + local Chars = MySQLAsyncExecute("SELECT * FROM `users` WHERE identifier LIKE '%"..GetIdentifierWithoutLicense(GetRockstarID(source)).."%'") for i = 1, #Chars, 1 do charJob = MySQLAsyncExecute("SELECT * FROM `jobs` WHERE `name` = '"..Chars[i].job.."'") From 640a32285302b6e0ded46f7bdd3aa9142685f76e Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 16:30:32 +0100 Subject: [PATCH 029/205] Update main.lua --- esx_kashacters/server/main.lua | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index 8b458cfa..b27ce4c6 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -28,19 +28,21 @@ end) RegisterServerEvent("kashactersS:CharacterChosen") AddEventHandler('kashactersS:CharacterChosen', function(charid, ischar) local src = source + local new = true local spawn = {} SetLastCharacter(src, tonumber(charid)) SetCharToIdentifier(GetRockstarID(src), tonumber(charid)) if ischar == "true" then + new = false spawn = GetSpawnPos(src) else TriggerClientEvent('skinchanger:loadDefaultModel', src, true, cb) spawn = { x = 195.55, y = -933.36, z = 29.90 } -- DEFAULT SPAWN POSITION end - TriggerClientEvent("kashactersC:SpawnCharacter", src, spawn) + TriggerClientEvent("kashactersC:SpawnCharacter", src, spawn, new) end) RegisterServerEvent("kashactersS:DeleteCharacter") @@ -106,13 +108,13 @@ function GetIdentifierWithoutLicense(Identifier) end function GetRockstarID(playerId) - local identifier + local identifier - for k,v in ipairs(GetPlayerIdentifiers(playerId)) do - if string.match(v, 'license:') then - identifier = v - break - end + for k,v in ipairs(GetPlayerIdentifiers(playerId)) do + if string.match(v, 'license:') then + identifier = v + break + end end return identifier From 6d0abfc71f2eaa71d3797389ccde49befad99dc2 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 16:31:49 +0100 Subject: [PATCH 030/205] Update main.lua --- esx_kashacters/client/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esx_kashacters/client/main.lua b/esx_kashacters/client/main.lua index e2c181e8..391e5772 100644 --- a/esx_kashacters/client/main.lua +++ b/esx_kashacters/client/main.lua @@ -100,7 +100,7 @@ AddEventHandler('kashactersC:SpawnCharacter', function(spawn, isnew) TriggerEvent('esx:kashloaded') - if isnew then + if isnew == true then TriggerEvent('esx_identity:showRegisterIdentity') end From 366e16eaf43d26a8e63590be70a052be83596ec1 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 16:33:33 +0100 Subject: [PATCH 031/205] Update README.md --- esx_kashacters/README.md | 274 +-------------------------------------- 1 file changed, 6 insertions(+), 268 deletions(-) diff --git a/esx_kashacters/README.md b/esx_kashacters/README.md index f29db6c0..32113d3f 100644 --- a/esx_kashacters/README.md +++ b/esx_kashacters/README.md @@ -1,276 +1,14 @@ # KASHacters - ESX Multi Characters -## Installation -**_How to install instruction._ Created By XxFri3ndlyxX** -
-- First you need a serrver that has at least the basic scripts and their requirements. +## Required changes: +* es_extended: (`es_extended/client/main.lua`) +Replace `AddEventHandler('playerSpawned', function()` (35) with: -``` -### [ESSENTIALS] ### -start mysql-async -start essentialmode -start esplugin_mysql -start es_extended -start async -start es_ui -start es_admin2 -start esx_kashacters -start esx_identity -start skinchanger -start esx_skin -start instance -start esx_datastore -start esx_addonaccount -start esx_addoninventory -start cron -start esx_menu_default -start esx_menu_list -start esx_menu_dialog -start esx_license -start esx_billing -start esx_society -start esx_policejob -start esx_ambulancejob -start esx_vehicleshop -``` - -
-Then -
-- Download the resource -- Rename the resource to esx_kashacters -- import the sql file in your database -- Go to *essentialmode\client\main.lua* and edit/comment the code. - - -``` ---[[Citizen.CreateThread(function() - while true do - Citizen.Wait(0) - - if NetworkIsSessionStarted() then - TriggerServerEvent('es:firstJoinProper') - TriggerEvent('es:allowedToSpawn') - return - end - end -end)]]-- -``` -## Inventory Quick Fix -- To fix the inventory not showing after death. -Quick fix you can do. -In es_extended Look for - -``` --- Menu interactions -Citizen.CreateThread(function() - while true do - - Citizen.Wait(0) - - if IsControlJustReleased(0, Keys['F2']) and IsInputDisabled(0) and not isDead and not ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then - ESX.ShowInventory() - end - - end -end) -``` -and change it to -``` --- Menu interactions -Citizen.CreateThread(function() - while true do - - Citizen.Wait(0) - - if IsControlJustReleased(0, Keys['F2']) and IsInputDisabled(0) and not ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then - ESX.ShowInventory() - end - - end -end) -``` --I know this is not the best solution. But i don't have time to fix this the proper way. Use this quick fix or fix it properly on your own. I's something to do with isdead not being trigged properly. Also you can do the same to other menu that don't work by removing the and not isDead - -## Tables (Owned & Identifier) -- Now we edit the table and add all our identifier to make sure our character loads. -- *Edit the code in esx_kashacters\server\main.lua* - - -``` -local IdentifierTables = { - {table = "addon_account_data", column = "owner"}, - {table = "addon_inventory_items", column = "owner"}, - {table = "billing", column = "identifier"}, - {table = "characters", column = "identifier"}, - {table = "datastore_data", column = "owner"}, - {table = "owned_vehicles", column = "owner"}, - {table = "rented_vehicles", column = "owner"}, - {table = "society_moneywash", column = "identifier"}, - {table = "users", column = "identifier"}, - {table = "user_accounts", column = "identifier"}, - {table = "user_inventory", column = "identifier"}, - {table = "user_licenses", column = "owner"}, -} -``` - -To get your identifier. -Do this query in your database - -`SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'owner'` - -and - -`SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'indentifier'` - - -Credit @Xnubil for this query line - - -The table list provided is just an example. Yours may differ depending on what you install on your server. - -Once You've done all that. add start esx_kashacters to your server.cfg - - -## Ambulance Fix -The Fix for the ambulance on the kashacter script is already implemented. - -Now all you have to do is go to your ambulance script that is up to date and -comment or delete - - - -``` ---[[ -AddEventHandler('playerSpawned', function() - IsDead = false - - if FirstSpawn then - exports.spawnmanager:setAutoSpawn(false) -- disable respawn - FirstSpawn = false - - ESX.TriggerServerCallback('esx_ambulancejob:getDeathStatus', function(isDead) - if isDead and Config.AntiCombatLog then - while not PlayerLoaded do - Citizen.Wait(1000) - end - - ESX.ShowNotification(_U('combatlog_message')) - RemoveItemsAfterRPDeath() - end - end) - end -end) -]]-- -``` -
-Then add this -
- -``` -RegisterNetEvent('esx_ambulancejob:multicharacter') -AddEventHandler('esx_ambulancejob:multicharacter', function() - IsDead = false - - ESX.TriggerServerCallback('esx_ambulancejob:getDeathStatus', function(isDead) - if isDead and Config.AntiCombatLog then - ESX.ShowNotification(_U('combatlog_message')) - RemoveItemsAfterRPDeath() - end - end) -end) -``` -Then change this -``` -function RespawnPed(ped, coords, heading) - SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false, false, true) - NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, heading, true, false) - SetPlayerInvincible(ped, false) - TriggerEvent('playerspawned', coords.x, coords.y, coords.z) - ClearPedBloodDamage(ped) - - ESX.UI.Menu.CloseAll() -end -``` -to -``` -function RespawnPed(ped, coords, heading) - SetEntityCoordsNoOffset(ped, coords.x, coords.y, coords.z, false, false, false, true) - NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, heading, true, false) - SetPlayerInvincible(ped, false) - TriggerEvent('esx_ambulancejob:multicharacter', coords.x, coords.y, coords.z) - ClearPedBloodDamage(ped) - - ESX.UI.Menu.CloseAll() -end -``` -If you do not do this last part once you repawn after death you will be frozen into place. - -## Duplication Entry (Datastore) -To fix The datastore duplicated entry download this https://github.com/XxFri3ndlyxX/esx_datastore - -Or - -Add this code to your server/main.lua -```-- Fix for kashacters duplication entry -- --- Fix was taken from this link -- --- https://forum.fivem.net/t/release-esx-kashacters-multi-character/251613/448?u=xxfri3ndlyxx -- -AddEventHandler('esx:playerLoaded', function(source) - - local result = MySQL.Sync.fetchAll('SELECT * FROM datastore') - - for i=1, #result, 1 do - local name = result[i].name - local label = result[i].label - local shared = result[i].shared - - local result2 = MySQL.Sync.fetchAll('SELECT * FROM datastore_data WHERE name = @name', { - ['@name'] = name - }) - - if shared == 0 then - - table.insert(DataStoresIndex, name) - DataStores[name] = {} - - for j=1, #result2, 1 do - local storeName = result2[j].name - local storeOwner = result2[j].owner - local storeData = (result2[j].data == nil and {} or json.decode(result2[j].data)) - local dataStore = CreateDataStore(storeName, storeOwner, storeData) - - table.insert(DataStores[name], dataStore) - end - end - end - - local _source = source - local xPlayer = ESX.GetPlayerFromId(_source) - local dataStores = {} - - for i=1, #DataStoresIndex, 1 do - local name = DataStoresIndex[i] - local dataStore = GetDataStore(name, xPlayer.identifier) - - if dataStore == nil then - MySQL.Async.execute('INSERT INTO datastore_data (name, owner, data) VALUES (@name, @owner, @data)', - { - ['@name'] = name, - ['@owner'] = xPlayer.identifier, - ['@data'] = '{}' - }) - - dataStore = CreateDataStore(name, xPlayer.identifier, {}) - table.insert(DataStores[name], dataStore) - end - - table.insert(dataStores, dataStore) - end - - xPlayer.set('dataStores', dataStores) -end) +```lua +RegisterNetEvent('esx:kashloaded') +AddEventHandler('esx:kashloaded', function() ``` > *Pay ATTENTION: You have to call the resource 'esx_kashacters' in order for the javascript to work!!!** From 0bab6a2604ec2a9f4c006d5932cb7dcc06152c0f Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 16:38:18 +0100 Subject: [PATCH 032/205] Update readme.md --- readme.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/readme.md b/readme.md index 775f67a8..b1981f6c 100644 --- a/readme.md +++ b/readme.md @@ -10,3 +10,13 @@ Replace `AddEventHandler('playerSpawned', function()` (35) with: RegisterNetEvent('esx:kashloaded') AddEventHandler('esx:kashloaded', function() ``` + +> *Pay ATTENTION: You have to call the resource 'esx_kashacters' in order for the javascript to work!!!** + +## How it works +> What this script does it manipulates ESX for loading characters +So when you are choosing your character it changes your **Rockstar license** which is normally **license:** to **Char:** this prevents ESX from loading another character because it is looking for you exact license. So when you choose your character it will change it from Char: to your normal Rockstar license (license:). When creating a new character it will spawn you without an exact license which creates a new database entry for your license. + +## Credits + +> ESX Framework and **KASH** AND **Onno204** for creating the resource. You can do whatever the f with it what you want but it is nice to give the main man credits ;) From 06dd900e0f964aa6c986169d5149554fb7d6b827 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 16:39:09 +0100 Subject: [PATCH 033/205] Update README.md --- esx_kashacters/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esx_kashacters/README.md b/esx_kashacters/README.md index 32113d3f..8ae0d344 100644 --- a/esx_kashacters/README.md +++ b/esx_kashacters/README.md @@ -1,4 +1,4 @@ -# KASHacters - ESX Multi Characters +# Thanks to KASH and XxFri3ndlyxX ## Required changes: @@ -15,7 +15,7 @@ AddEventHandler('esx:kashloaded', function() ## How it works > What this script does it manipulates ESX for loading characters -So when you are choosing your character it changes your steam id which is normally steam: to Char: this prevents ESX from loading another character because it is looking for you exact steamid. So when you choose your character it will change it from Char: to your normal steam id (steam:). When creating a new character it will spawn you without an exact steamid which creates a new database entry for your steamid +So when you are choosing your character it changes your **Rockstar license** which is normally **license:** to **Char:** this prevents ESX from loading another character because it is looking for you exact license. So when you choose your character it will change it from Char: to your normal Rockstar license (license:). When creating a new character it will spawn you without an exact license which creates a new database entry for your license. ## Credits From feafbe61f85921ff1e19a7ac2ff18d0c5ff74c55 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 22 Feb 2020 16:41:11 +0100 Subject: [PATCH 034/205] Create FUNDING.yml --- .github/FUNDING.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..5aa9e609 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +custom: ['https://www.paypal.me/RikoCash'] From be07044b53e5bc442e3317aeda1510123ca46f18 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sun, 23 Feb 2020 12:07:34 +0100 Subject: [PATCH 035/205] Creating characters fix. --- readme.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/readme.md b/readme.md index b1981f6c..9532184b 100644 --- a/readme.md +++ b/readme.md @@ -11,6 +11,34 @@ RegisterNetEvent('esx:kashloaded') AddEventHandler('esx:kashloaded', function() ``` +* es_extended: (`es_extended/server/main.lua`) + +### Change this code in `onPlayerJoined(playerId)` function: + +```lua + for k,v in ipairs(GetPlayerIdentifiers(playerId)) do + if string.match(v, 'license:') then + identifier = string.sub(v, 9) + break + end + end +``` + +### to: + + +``` + for k,v in ipairs(GetPlayerIdentifiers(playerId)) do + if string.match(v, 'license:') then + identifier = v + break + end + end +``` + +# WARNING! +> You **MUST** incerase characters limit in `users` table for row `identifier` to **48**. + > *Pay ATTENTION: You have to call the resource 'esx_kashacters' in order for the javascript to work!!!** ## How it works From b67530799f9794ac6695297a205761209471be0e Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sun, 23 Feb 2020 12:09:09 +0100 Subject: [PATCH 036/205] [IMPORTANT] Creating characters fix. --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 9532184b..3b89ada6 100644 --- a/readme.md +++ b/readme.md @@ -27,7 +27,7 @@ AddEventHandler('esx:kashloaded', function() ### to: -``` +```lua for k,v in ipairs(GetPlayerIdentifiers(playerId)) do if string.match(v, 'license:') then identifier = v @@ -37,7 +37,7 @@ AddEventHandler('esx:kashloaded', function() ``` # WARNING! -> You **MUST** incerase characters limit in `users` table for row `identifier` to **48**. +> You **MUST** incerase the character limit in the `users` table for row `identifier` to **48**. > *Pay ATTENTION: You have to call the resource 'esx_kashacters' in order for the javascript to work!!!** From e52ae3203691f1315d5210e93817aea8a8192fde Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sun, 23 Feb 2020 12:13:24 +0100 Subject: [PATCH 037/205] Delete README.md --- esx_kashacters/README.md | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 esx_kashacters/README.md diff --git a/esx_kashacters/README.md b/esx_kashacters/README.md deleted file mode 100644 index 8ae0d344..00000000 --- a/esx_kashacters/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Thanks to KASH and XxFri3ndlyxX - -## Required changes: - -* es_extended: (`es_extended/client/main.lua`) - -Replace `AddEventHandler('playerSpawned', function()` (35) with: - -```lua -RegisterNetEvent('esx:kashloaded') -AddEventHandler('esx:kashloaded', function() -``` - -> *Pay ATTENTION: You have to call the resource 'esx_kashacters' in order for the javascript to work!!!** - -## How it works -> What this script does it manipulates ESX for loading characters -So when you are choosing your character it changes your **Rockstar license** which is normally **license:** to **Char:** this prevents ESX from loading another character because it is looking for you exact license. So when you choose your character it will change it from Char: to your normal Rockstar license (license:). When creating a new character it will spawn you without an exact license which creates a new database entry for your license. - -## Credits - -> ESX Framework and **KASH** AND **Onno204** for creating the resource. You can do whatever the f with it what you want but it is nice to give the main man credits ;) From 4a8339b0f6940f43a70e4eab0737dea997f7d5f6 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Wed, 26 Feb 2020 17:09:47 +0100 Subject: [PATCH 038/205] Update readme.md --- readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.md b/readme.md index 3b89ada6..1e08a9c0 100644 --- a/readme.md +++ b/readme.md @@ -36,6 +36,10 @@ AddEventHandler('esx:kashloaded', function() end ``` +# Using kashacters without esx_ambulancejob (respawn fix) + +> Remove `exports.spawnmanager:setAutoSpawn(false)` from `client/main.lua`. + # WARNING! > You **MUST** incerase the character limit in the `users` table for row `identifier` to **48**. From d90553cfa5dc35bd140ed78356b1d500c4e99f01 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Wed, 26 Feb 2020 17:10:20 +0100 Subject: [PATCH 039/205] Add respawn fix to readme. --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 1e08a9c0..04506989 100644 --- a/readme.md +++ b/readme.md @@ -36,7 +36,7 @@ AddEventHandler('esx:kashloaded', function() end ``` -# Using kashacters without esx_ambulancejob (respawn fix) +## Using kashacters without esx_ambulancejob (respawn fix) > Remove `exports.spawnmanager:setAutoSpawn(false)` from `client/main.lua`. From eef971c08b1c065ad7ab51385f47a8794c96f620 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 7 Mar 2020 11:17:14 +0100 Subject: [PATCH 040/205] The user_accounts table has been moved... ...to users in the latest es_extended update. --- esx_kashacters/server/main.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index b27ce4c6..e1fcee69 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -11,7 +11,6 @@ local IdentifierTables = { {table = "owned_properties", column = "owner"}, {table = "rented_vehicles", column = "owner"}, {table = "users", column = "identifier"}, - {table = "user_accounts", column = "identifier"}, {table = "user_licenses", column = "owner"}, } From 71a7f8bf54fac9c9220a1932c327cb6c3620158d Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Wed, 25 Mar 2020 10:11:16 +0100 Subject: [PATCH 041/205] Support for the new version of ESX, again... --- esx_kashacters/client/main.lua | 10 ++---- readme-pl.md | 64 ++++++++++++++++++++++++++++++++++ readme.md | 36 ++++++++++++------- 3 files changed, 90 insertions(+), 20 deletions(-) create mode 100644 readme-pl.md diff --git a/esx_kashacters/client/main.lua b/esx_kashacters/client/main.lua index 391e5772..d8740535 100644 --- a/esx_kashacters/client/main.lua +++ b/esx_kashacters/client/main.lua @@ -6,9 +6,6 @@ Citizen.CreateThread(function() end end) --- This Code Was changed to fix error With player spawner as default -- --- Link to the post with the error fix -- --- https://forum.fivem.net/t/release-esx-kashacters-multi-character/251613/316?u=xxfri3ndlyxx -- Citizen.CreateThread(function() while true do Citizen.Wait(0) @@ -16,7 +13,7 @@ Citizen.CreateThread(function() Citizen.Wait(100) TriggerServerEvent("kashactersS:SetupCharacters") TriggerEvent("kashactersC:SetupCharacters") - return -- break the loop + return end end end) @@ -32,8 +29,7 @@ Citizen.CreateThread(function () end end) -local cam = nil -local cam2 = nil +local cam, cam2 = nil, nil RegisterNetEvent('kashactersC:SetupCharacters') AddEventHandler('kashactersC:SetupCharacters', function() @@ -77,8 +73,6 @@ AddEventHandler('kashactersC:SpawnCharacter', function(spawn, isnew) Citizen.Wait(900) - exports.spawnmanager:setAutoSpawn(false) - cam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", pos.x,pos.y,pos.z+200, 300.00,0.00,0.00, 100.00, false, 0) PointCamAtCoord(cam, pos.x,pos.y,pos.z+2) SetCamActiveWithInterp(cam, cam2, 3700, true, true) diff --git a/readme-pl.md b/readme-pl.md new file mode 100644 index 00000000..e006467b --- /dev/null +++ b/readme-pl.md @@ -0,0 +1,64 @@ +# Podziękowania dla KASH oraz XxFri3ndlyxX. +### If you are updating ESX, be sure to update the remaining scripts! + +## Required changes: + +* es_extended: (`es_extended/client/main.lua`) + +### Zamień podany kod: + +```lua +Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + + if NetworkIsPlayerActive(PlayerId()) then + TriggerServerEvent('esx:onPlayerJoined') + break + end + end +end) +``` + +### na: + +```lua +RegisterNetEvent('esx:kashloaded') +AddEventHandler('esx:kashloaded', function() + TriggerServerEvent('esx:onPlayerJoined') +end) +``` + +* es_extended: (`es_extended/server/main.lua`) + +### Zamień podany kod: + +```lua + for k,v in ipairs(GetPlayerIdentifiers(playerId)) do + if string.match(v, 'license:') then + identifier = string.sub(v, 9) + break + end + end +``` + +### na: + + +```lua + for k,v in ipairs(GetPlayerIdentifiers(playerId)) do + if string.match(v, 'license:') then + identifier = v + break + end + end +``` + +# Przeczytaj uważnie... +> **Musisz** zwiększyć limit znaków w tabeli `users`dla kolumny `identifier` do **48**. +> **Nie** używaj essentialsmode, mapmanager oraz spawnmanager. +> **Uwaga!** Musisz nazwać skrypt 'esx_kashacters', aby wszystko działało poprawnie. + +## Jak to działa? +> Ten skrypt manipuluje ładowaniem postaci przez ESX. +Kiedy więc wybierasz swoją postać, skrypt zmienia twoją **licencje rockstar**, która jest normalnie zapisywana jako **license:** na **Char:**, co zapobiega ładowaniu przez ESX innej postaci, ponieważ szuka on dokładnej licencji. diff --git a/readme.md b/readme.md index 04506989..81145900 100644 --- a/readme.md +++ b/readme.md @@ -1,14 +1,34 @@ # Thanks to KASH and XxFri3ndlyxX +### If you are updating ESX, be sure to update the remaining scripts! + +Instrukcja w języku Polskim znajduje się [tutaj](https://github.com/fivem-ex/esx_kashacter/blob/master/readme-pl.md). ## Required changes: * es_extended: (`es_extended/client/main.lua`) -Replace `AddEventHandler('playerSpawned', function()` (35) with: +### Replace this code: + +```lua +Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + + if NetworkIsPlayerActive(PlayerId()) then + TriggerServerEvent('esx:onPlayerJoined') + break + end + end +end) +``` + +### with: ```lua RegisterNetEvent('esx:kashloaded') AddEventHandler('esx:kashloaded', function() + TriggerServerEvent('esx:onPlayerJoined') +end) ``` * es_extended: (`es_extended/server/main.lua`) @@ -36,19 +56,11 @@ AddEventHandler('esx:kashloaded', function() end ``` -## Using kashacters without esx_ambulancejob (respawn fix) - -> Remove `exports.spawnmanager:setAutoSpawn(false)` from `client/main.lua`. - -# WARNING! +# Read carefully... > You **MUST** incerase the character limit in the `users` table for row `identifier` to **48**. - -> *Pay ATTENTION: You have to call the resource 'esx_kashacters' in order for the javascript to work!!!** +> Do **not** use essentialsmode, mapmanager and spawnmanager! +> *Pay ATTENTION: You have to call the resource 'esx_kashacters' in order for the javascript to work!** ## How it works > What this script does it manipulates ESX for loading characters So when you are choosing your character it changes your **Rockstar license** which is normally **license:** to **Char:** this prevents ESX from loading another character because it is looking for you exact license. So when you choose your character it will change it from Char: to your normal Rockstar license (license:). When creating a new character it will spawn you without an exact license which creates a new database entry for your license. - -## Credits - -> ESX Framework and **KASH** AND **Onno204** for creating the resource. You can do whatever the f with it what you want but it is nice to give the main man credits ;) From b49a476fc82f97a08c4474ad44464c2db4138453 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Wed, 25 Mar 2020 10:14:11 +0100 Subject: [PATCH 042/205] Fix for Polish readme. --- readme-pl.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/readme-pl.md b/readme-pl.md index e006467b..d4f7aafe 100644 --- a/readme-pl.md +++ b/readme-pl.md @@ -1,7 +1,7 @@ # Podziękowania dla KASH oraz XxFri3ndlyxX. -### If you are updating ESX, be sure to update the remaining scripts! +### Jeśli aktualizujesz ESX, pamiętaj o aktualizacji pozostałych skryptów! -## Required changes: +## Wymagane zmiany: * es_extended: (`es_extended/client/main.lua`) @@ -56,7 +56,9 @@ end) # Przeczytaj uważnie... > **Musisz** zwiększyć limit znaków w tabeli `users`dla kolumny `identifier` do **48**. + > **Nie** używaj essentialsmode, mapmanager oraz spawnmanager. + > **Uwaga!** Musisz nazwać skrypt 'esx_kashacters', aby wszystko działało poprawnie. ## Jak to działa? From c3a731155fc0fcad4639e74e0774dd6c7dcf0384 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Wed, 25 Mar 2020 10:15:33 +0100 Subject: [PATCH 043/205] Fix for English readme. --- readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme.md b/readme.md index 81145900..74c274b2 100644 --- a/readme.md +++ b/readme.md @@ -58,7 +58,9 @@ end) # Read carefully... > You **MUST** incerase the character limit in the `users` table for row `identifier` to **48**. + > Do **not** use essentialsmode, mapmanager and spawnmanager! + > *Pay ATTENTION: You have to call the resource 'esx_kashacters' in order for the javascript to work!** ## How it works From 5f43c69987385e18345e9244b7aea5bc6f813229 Mon Sep 17 00:00:00 2001 From: rex2630 Date: Wed, 25 Mar 2020 13:07:10 +0100 Subject: [PATCH 044/205] Fix for disconnect --- readme.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 74c274b2..acdc51dd 100644 --- a/readme.md +++ b/readme.md @@ -27,7 +27,9 @@ end) ```lua RegisterNetEvent('esx:kashloaded') AddEventHandler('esx:kashloaded', function() - TriggerServerEvent('esx:onPlayerJoined') + if isFirstSpawn then + TriggerServerEvent('esx:onPlayerJoined') + end end) ``` From 66f751f8c23943e5bc1774342b471c6c9ad56514 Mon Sep 17 00:00:00 2001 From: rex2630 Date: Wed, 25 Mar 2020 13:08:14 +0100 Subject: [PATCH 045/205] Fix for disconnect --- readme-pl.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/readme-pl.md b/readme-pl.md index d4f7aafe..23d6dfca 100644 --- a/readme-pl.md +++ b/readme-pl.md @@ -25,7 +25,9 @@ end) ```lua RegisterNetEvent('esx:kashloaded') AddEventHandler('esx:kashloaded', function() - TriggerServerEvent('esx:onPlayerJoined') + if isFirstSpawn then + TriggerServerEvent('esx:onPlayerJoined') + end end) ``` From 220f21db35037f7cc865b4d504735f1bd3cdbdd1 Mon Sep 17 00:00:00 2001 From: Dione Batista Date: Thu, 26 Mar 2020 18:40:40 -0300 Subject: [PATCH 046/205] Correction Correction for Characters dont loading on login --- esx_kashacters/server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index e1fcee69..0e2232f0 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -103,7 +103,7 @@ function GetSpawnPos(source) end function GetIdentifierWithoutLicense(Identifier) - return string.gsub(Identifier, "license", "") + return string.gsub(Identifier, "license:", "") end function GetRockstarID(playerId) From 2f9829c302503f2bbbf48227ae95502814b50d60 Mon Sep 17 00:00:00 2001 From: Dione Batista Date: Thu, 26 Mar 2020 18:49:13 -0300 Subject: [PATCH 047/205] Correction of NUI Callback Correction for NUI Callback using the resource with the name of repository --- esx_kashacters/html/js/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esx_kashacters/html/js/app.js b/esx_kashacters/html/js/app.js index db2fa3f3..e01f864c 100644 --- a/esx_kashacters/html/js/app.js +++ b/esx_kashacters/html/js/app.js @@ -24,7 +24,7 @@ $(".character-box").click(function () { }); $("#play-char").click(function () { - $.post("http://esx_kashacters/CharacterChosen", JSON.stringify({ + $.post("http://esx_kashacter/CharacterChosen", JSON.stringify({ charid: $('.active-char').attr("data-charid"), ischar: $('.active-char').attr("data-ischar"), })); @@ -32,7 +32,7 @@ $("#play-char").click(function () { }); $("#deletechar").click(function () { - $.post("http://esx_kashacters/DeleteCharacter", JSON.stringify({ + $.post("http://esx_kashacter/DeleteCharacter", JSON.stringify({ charid: $('.active-char').attr("data-charid"), })); Kashacter.CloseUI(); @@ -69,4 +69,4 @@ $("#deletechar").click(function () { }) } -})(); \ No newline at end of file +})(); From bbe14d30d3b0697f97a70a5e10fcd7f457fac2db Mon Sep 17 00:00:00 2001 From: Dione Batista Date: Thu, 26 Mar 2020 18:57:53 -0300 Subject: [PATCH 048/205] More Corrections correction in the camera spawn getting stuck for not finding the player's coordinates --- esx_kashacters/server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index 0e2232f0..ba24a18b 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -98,7 +98,7 @@ function DeleteCharacter(identifier, charid) end function GetSpawnPos(source) - local SpawnPos = MySQLAsyncExecute("SELECT `position` FROM `users` WHERE `identifier` = '"..GetRockstarID(source).."'") + local SpawnPos = MySQLAsyncExecute("SELECT `position` FROM `users` WHERE `identifier` = '"..GetIdentifierWithoutLicense(GetRockstarID(source)).."'") return json.decode(SpawnPos[1].position) end From c6f2e2c52f571b04740ccae53b6de9b6b0398cf6 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 28 Mar 2020 06:33:30 +0100 Subject: [PATCH 049/205] Update readme.md --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index acdc51dd..8d293430 100644 --- a/readme.md +++ b/readme.md @@ -63,7 +63,7 @@ end) > Do **not** use essentialsmode, mapmanager and spawnmanager! -> *Pay ATTENTION: You have to call the resource 'esx_kashacters' in order for the javascript to work!** +> *Pay ATTENTION: You have to call the resource **esx_kashacter** in order for the javascript to work!** ## How it works > What this script does it manipulates ESX for loading characters From c3b23f397314116ed94844abe68f8e9ab53e6b18 Mon Sep 17 00:00:00 2001 From: RikoDEV <18230443+RikoDEV@users.noreply.github.com> Date: Sat, 28 Mar 2020 06:33:59 +0100 Subject: [PATCH 050/205] Update readme-pl.md --- readme-pl.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme-pl.md b/readme-pl.md index 23d6dfca..9271a3e7 100644 --- a/readme-pl.md +++ b/readme-pl.md @@ -61,7 +61,7 @@ end) > **Nie** używaj essentialsmode, mapmanager oraz spawnmanager. -> **Uwaga!** Musisz nazwać skrypt 'esx_kashacters', aby wszystko działało poprawnie. +> **Uwaga!** Musisz nazwać skrypt **esx_kashacter**, aby wszystko działało poprawnie. ## Jak to działa? > Ten skrypt manipuluje ładowaniem postaci przez ESX. From 7a142d87ca559f406bb04c2de6229477f3b256de Mon Sep 17 00:00:00 2001 From: KoolAiddTV <51595577+KoolAiddTV@users.noreply.github.com> Date: Wed, 1 Apr 2020 00:30:11 -0400 Subject: [PATCH 051/205] New code to comment out With that code commented out the spawn in is back to normal. It allows for the backdrop when character selecting and does the actual drop-in on the camera. --- readme.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/readme.md b/readme.md index 8d293430..de267825 100644 --- a/readme.md +++ b/readme.md @@ -7,6 +7,27 @@ Instrukcja w języku Polskim znajduje się [tutaj](https://github.com/fivem-ex/e * es_extended: (`es_extended/client/main.lua`) +### Comment out this code: +```lua +-- check if player is coming from loading screen + if GetEntityModel(PlayerPedId()) == GetHashKey('PLAYER_ZERO') then + local defaultModel = GetHashKey('a_m_y_stbla_02') + RequestModel(defaultModel) + + while not HasModelLoaded(defaultModel) do + Citizen.Wait(100) + end + + SetPlayerModel(PlayerId(), defaultModel) + local playerPed = PlayerPedId() + + SetPedDefaultComponentVariation(playerPed) + SetPedRandomComponentVariation(playerPed, true) + SetModelAsNoLongerNeeded(defaultModel) + FreezeEntityPosition(playerPed, false) + end +``` + ### Replace this code: ```lua From b1999fde56151b9ecf378e074f3e861c9f3be0ab Mon Sep 17 00:00:00 2001 From: KoolAiddTV <51595577+KoolAiddTV@users.noreply.github.com> Date: Wed, 1 Apr 2020 00:30:53 -0400 Subject: [PATCH 052/205] Update readme.md --- readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme.md b/readme.md index de267825..f30c9fed 100644 --- a/readme.md +++ b/readme.md @@ -28,6 +28,8 @@ Instrukcja w języku Polskim znajduje się [tutaj](https://github.com/fivem-ex/e end ``` +* es_extended: (`es_extended/client/main.lua`) + ### Replace this code: ```lua From 1fa58f645cec982559e080880f246cd35ab051da Mon Sep 17 00:00:00 2001 From: Henric Backman Date: Fri, 10 Apr 2020 04:46:50 +0200 Subject: [PATCH 053/205] Fix cash/bank showing as undefined with new ESX --- esx_kashacters/server/main.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index ba24a18b..137ec1f4 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -57,6 +57,9 @@ function GetPlayerCharacters(source) for i = 1, #Chars, 1 do charJob = MySQLAsyncExecute("SELECT * FROM `jobs` WHERE `name` = '"..Chars[i].job.."'") charJobgrade = MySQLAsyncExecute("SELECT * FROM `job_grades` WHERE `grade` = '"..Chars[i].job_grade.."'") + local accounts = json.decode(Chars[1].accounts) + Chars[i].bank = accounts["bank"] + Chars[i].money = accounts["money"] Chars[i].job = charJob[1].label Chars[i].job_grade = charJobgrade[1].label end From 26ca0a148eed061dea2f739a705dd149db0206be Mon Sep 17 00:00:00 2001 From: Henric Backman Date: Fri, 10 Apr 2020 04:53:39 +0200 Subject: [PATCH 054/205] this need to be an i --- esx_kashacters/server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esx_kashacters/server/main.lua b/esx_kashacters/server/main.lua index 137ec1f4..b5b78700 100644 --- a/esx_kashacters/server/main.lua +++ b/esx_kashacters/server/main.lua @@ -57,7 +57,7 @@ function GetPlayerCharacters(source) for i = 1, #Chars, 1 do charJob = MySQLAsyncExecute("SELECT * FROM `jobs` WHERE `name` = '"..Chars[i].job.."'") charJobgrade = MySQLAsyncExecute("SELECT * FROM `job_grades` WHERE `grade` = '"..Chars[i].job_grade.."'") - local accounts = json.decode(Chars[1].accounts) + local accounts = json.decode(Chars[i].accounts) Chars[i].bank = accounts["bank"] Chars[i].money = accounts["money"] Chars[i].job = charJob[1].label From 3940787978ab7b97150fc647bd59bc21b4b19e92 Mon Sep 17 00:00:00 2001 From: Henric Backman Date: Fri, 10 Apr 2020 05:43:32 +0200 Subject: [PATCH 055/205] Actually make use of the job_grade that was added --- esx_kashacters/html/js/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esx_kashacters/html/js/app.js b/esx_kashacters/html/js/app.js index e01f864c..6bb28034 100644 --- a/esx_kashacters/html/js/app.js +++ b/esx_kashacters/html/js/app.js @@ -47,7 +47,7 @@ $("#deletechar").click(function () { $.each(data.characters, function (index, char) { if (char.charid !== 0) { var charid = char.identifier.charAt(4); - $('[data-charid=' + charid + ']').html('