@mjhls/mjh-framework 1.0.790 → 1.0.791-auth-test

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/README.md +170 -170
  2. package/dist/cjs/AD.js +1 -1
  3. package/dist/cjs/AD300x250.js +15 -15
  4. package/dist/cjs/AD300x250x600.js +15 -15
  5. package/dist/cjs/AD728x90.js +16 -16
  6. package/dist/cjs/ADFloatingFooter.js +14 -14
  7. package/dist/cjs/ADFooter.js +5 -5
  8. package/dist/cjs/ADGutter.js +14 -14
  9. package/dist/cjs/{ADInfeed-1e53d7db.js → ADInfeed-e7aecdf9.js} +1 -1
  10. package/dist/cjs/ADSkyscraper.js +14 -14
  11. package/dist/cjs/ADSponsoredResources.js +14 -14
  12. package/dist/cjs/ADWebcast.js +14 -14
  13. package/dist/cjs/ADWelcome.js +14 -14
  14. package/dist/cjs/{ADlgInfeed-2494fd17.js → ADlgInfeed-0941023e.js} +1 -1
  15. package/dist/cjs/AccordionPanel.js +5 -5
  16. package/dist/cjs/AdSlot.js +16 -16
  17. package/dist/cjs/AdSlotsProvider.js +10 -10
  18. package/dist/cjs/AlphabeticList.js +9 -9
  19. package/dist/cjs/ArticleCarousel.js +11 -11
  20. package/dist/cjs/ArticleProgramLandingPage.js +25 -25
  21. package/dist/cjs/ArticleSeriesLandingPage.js +24 -24
  22. package/dist/cjs/ArticleSeriesListing.js +17 -17
  23. package/dist/cjs/Auth.js +206 -468
  24. package/dist/cjs/AuthWrapper.js +2948 -0
  25. package/dist/cjs/{AuthorComponent-5fa89df5.js → AuthorComponent-c21aac7f.js} +1 -1
  26. package/dist/cjs/Beam.js +7 -7
  27. package/dist/cjs/{BlockContent-eca358e4.js → BlockContent-36e54d77.js} +34 -34
  28. package/dist/cjs/Breadcrumbs.js +5 -5
  29. package/dist/cjs/CMEDeck.js +14 -14
  30. package/dist/cjs/Column2.js +11 -11
  31. package/dist/cjs/Column3.js +20 -20
  32. package/dist/cjs/ConferenceArticleCard.js +16 -16
  33. package/dist/cjs/DeckContent.js +31 -31
  34. package/dist/cjs/DeckQueue.js +21 -21
  35. package/dist/cjs/{Dfp-6d140494.js → Dfp-3f0ed4c8.js} +8 -8
  36. package/dist/cjs/EventsDeck.js +36 -36
  37. package/dist/cjs/ExternalResources.js +26 -26
  38. package/dist/cjs/Feature.js +3 -3
  39. package/dist/cjs/ForbesHero.js +7 -7
  40. package/dist/cjs/GridContent.js +30 -30
  41. package/dist/cjs/GridHero.js +7 -7
  42. package/dist/cjs/GroupDeck.js +9 -9
  43. package/dist/cjs/HamMagazine.js +21 -21
  44. package/dist/cjs/Hero.js +1 -1
  45. package/dist/cjs/HorizontalArticleListing.js +25 -25
  46. package/dist/cjs/HorizontalHero.js +1 -1
  47. package/dist/cjs/IssueContentDeck.js +7 -7
  48. package/dist/cjs/IssueDeck.js +10 -10
  49. package/dist/cjs/IssueLanding.js +49 -49
  50. package/dist/cjs/KMTracker.js +15 -15
  51. package/dist/cjs/LeftNav.js +14 -14
  52. package/dist/cjs/MasterDeck.js +32 -32
  53. package/dist/cjs/MediaSeriesLanding.js +409 -400
  54. package/dist/cjs/NavDvm.js +7 -7
  55. package/dist/cjs/NavMagazine.js +21 -21
  56. package/dist/cjs/NavNative.js +26 -26
  57. package/dist/cjs/NavNormal.js +7 -7
  58. package/dist/cjs/OncliveHero.js +1 -1
  59. package/dist/cjs/OncliveLargeHero.js +7 -7
  60. package/dist/cjs/PageFilter.js +5 -5
  61. package/dist/cjs/PartnerDetailListing.js +29 -29
  62. package/dist/cjs/PopUpModal.js +5 -5
  63. package/dist/cjs/PubSection.js +20 -20
  64. package/dist/cjs/PubToc.js +7 -7
  65. package/dist/cjs/PublicationDeck.js +2 -2
  66. package/dist/cjs/PublicationLanding.js +49 -49
  67. package/dist/cjs/QueueDeckExpanded.js +22 -22
  68. package/dist/cjs/RecentNews.js +1 -1
  69. package/dist/cjs/RelatedContent.js +29 -29
  70. package/dist/cjs/RelatedTopicsDropdown.js +10 -10
  71. package/dist/cjs/Search.js +5 -5
  72. package/dist/cjs/Segment.js +6 -6
  73. package/dist/cjs/SeriesListingDeck.js +12 -12
  74. package/dist/cjs/{SeriesSlider-49577417.js → SeriesSlider-c022ce04.js} +12 -12
  75. package/dist/cjs/SideFooter.js +13 -13
  76. package/dist/cjs/{SocialSearchComponent-45c54bed.js → SocialSearchComponent-31afe61f.js} +6 -6
  77. package/dist/cjs/TaxonomyCard.js +5 -5
  78. package/dist/cjs/TaxonomyDescription.js +25 -25
  79. package/dist/cjs/TemplateNormal.js +19 -19
  80. package/dist/cjs/ThumbnailCard.js +1 -1
  81. package/dist/cjs/Ustream.js +7 -7
  82. package/dist/cjs/VerticalHero.js +1 -1
  83. package/dist/cjs/VideoProgramLandingPage.js +25 -25
  84. package/dist/cjs/VideoSeriesCard.js +8 -8
  85. package/dist/cjs/VideoSeriesFilter.js +7 -7
  86. package/dist/cjs/VideoSeriesLandingPage.js +24 -24
  87. package/dist/cjs/VideoSeriesListing.js +17 -17
  88. package/dist/cjs/View.js +40 -40
  89. package/dist/cjs/YahooHero.js +7 -7
  90. package/dist/cjs/YoutubeGroup.js +19 -19
  91. package/dist/cjs/{_is-array-63ae4740.js → _is-array-6128bd56.js} +1 -1
  92. package/dist/cjs/{_iter-detect-2613ffa1.js → _iter-detect-55a5657a.js} +8 -8
  93. package/dist/cjs/{_object-pie-68c5bcbc.js → _object-pie-083f2dd6.js} +4 -4
  94. package/dist/cjs/{_object-sap-c5bd707d.js → _object-sap-a175b4a9.js} +1 -1
  95. package/dist/cjs/{_object-to-array-bec5fcf2.js → _object-to-array-8fe5a54f.js} +2 -2
  96. package/dist/cjs/{_to-object-821a2927.js → _to-object-6de10e57.js} +4 -4
  97. package/dist/cjs/{asyncToGenerator-b6a175bf.js → asyncToGenerator-58c289d9.js} +30 -30
  98. package/dist/cjs/{core.get-iterator-method-b4615fd3.js → core.get-iterator-method-f474eacc.js} +2 -2
  99. package/dist/cjs/{debounce-529c8d06.js → debounce-d4a2369b.js} +2 -2
  100. package/dist/cjs/{define-property-aff11f8a.js → define-property-c88be878.js} +6 -6
  101. package/dist/cjs/{defineProperty-d6fbb280.js → defineProperty-0cb76d99.js} +1 -1
  102. package/dist/cjs/empty-7d04c64b.js +5 -0
  103. package/dist/cjs/{eq-bb2843ed.js → eq-5fc26c07.js} +1 -1
  104. package/dist/cjs/{es6.string.iterator-20d42c53.js → es6.string.iterator-c2573ffd.js} +5 -5
  105. package/dist/cjs/{extends-1e24fc8d.js → extends-29bdbc6d.js} +8 -7
  106. package/dist/cjs/faundadb.js +1637 -0
  107. package/dist/cjs/{get-adbb11e3.js → get-5839e5b5.js} +21 -21
  108. package/dist/cjs/getRelatedArticle.js +11 -9
  109. package/dist/cjs/getRootDocGroup.js +6 -6
  110. package/dist/cjs/getSerializers.js +25 -25
  111. package/dist/cjs/{getTargeting-497b581d.js → getTargeting-45b91c88.js} +11 -11
  112. package/dist/cjs/getTargeting.js +8 -8
  113. package/dist/cjs/{index-d450e2d5.js → index-d9eab30b.js} +341 -92
  114. package/dist/cjs/{index-d48b231c.js → index-efca863c.js} +5 -5
  115. package/dist/cjs/{index-4d74ffd6.js → index-f86bb269.js} +4 -4
  116. package/dist/cjs/index.js +37 -37
  117. package/dist/cjs/{inherits-2eb23889.js → inherits-c2065b95.js} +22 -19
  118. package/dist/cjs/inheritsLoose-b17eb2a8.js +18 -0
  119. package/dist/cjs/{isSymbol-04666465.js → isSymbol-03abbdf0.js} +15 -15
  120. package/dist/cjs/keys-7f2c2108.js +25 -0
  121. package/dist/cjs/{lodash-4ef21f0f.js → lodash-f0783643.js} +57 -9
  122. package/dist/cjs/{main-dc082238.js → main-025fdc78.js} +184 -109
  123. package/dist/cjs/{slicedToArray-db24842a.js → slicedToArray-5d1bc3b3.js} +14 -14
  124. package/dist/cjs/stringify-c9ac1214.js +17 -0
  125. package/dist/cjs/{toConsumableArray-cf0865fc.js → toConsumableArray-ddb70795.js} +9 -9
  126. package/dist/cjs/{toNumber-36d1e7e5.js → toNumber-5e1fac58.js} +40 -5
  127. package/dist/cjs/{typeof-97065d40.js → typeof-88a668c5.js} +34 -34
  128. package/dist/cjs/urlFor.js +1 -1
  129. package/dist/cjs/{web.dom.iterable-4480325a.js → web.dom.iterable-46657b5c.js} +2 -2
  130. package/dist/esm/AD.js +1 -1
  131. package/dist/esm/AD300x250.js +15 -15
  132. package/dist/esm/AD300x250x600.js +15 -15
  133. package/dist/esm/AD728x90.js +16 -16
  134. package/dist/esm/ADFloatingFooter.js +14 -14
  135. package/dist/esm/ADFooter.js +5 -5
  136. package/dist/esm/ADGutter.js +14 -14
  137. package/dist/esm/{ADInfeed-94817c40.js → ADInfeed-e1e18f87.js} +1 -1
  138. package/dist/esm/ADSkyscraper.js +14 -14
  139. package/dist/esm/ADSponsoredResources.js +14 -14
  140. package/dist/esm/ADWebcast.js +14 -14
  141. package/dist/esm/ADWelcome.js +14 -14
  142. package/dist/esm/{ADlgInfeed-6124ee3c.js → ADlgInfeed-c6d2831b.js} +1 -1
  143. package/dist/esm/AccordionPanel.js +5 -5
  144. package/dist/esm/AdSlot.js +16 -16
  145. package/dist/esm/AdSlotsProvider.js +10 -10
  146. package/dist/esm/AlphabeticList.js +9 -9
  147. package/dist/esm/ArticleCarousel.js +11 -11
  148. package/dist/esm/ArticleProgramLandingPage.js +25 -25
  149. package/dist/esm/ArticleSeriesLandingPage.js +24 -24
  150. package/dist/esm/ArticleSeriesListing.js +17 -17
  151. package/dist/esm/Auth.js +207 -469
  152. package/dist/esm/AuthWrapper.js +2942 -0
  153. package/dist/esm/{AuthorComponent-c7ff069f.js → AuthorComponent-5ae7409f.js} +1 -1
  154. package/dist/esm/Beam.js +7 -7
  155. package/dist/esm/{BlockContent-d8cd739c.js → BlockContent-52cf21c5.js} +34 -34
  156. package/dist/esm/Breadcrumbs.js +5 -5
  157. package/dist/esm/CMEDeck.js +14 -14
  158. package/dist/esm/Column2.js +11 -11
  159. package/dist/esm/Column3.js +20 -20
  160. package/dist/esm/ConferenceArticleCard.js +16 -16
  161. package/dist/esm/DeckContent.js +31 -31
  162. package/dist/esm/DeckQueue.js +21 -21
  163. package/dist/esm/{Dfp-313e4ebe.js → Dfp-a304d96c.js} +8 -8
  164. package/dist/esm/EventsDeck.js +36 -36
  165. package/dist/esm/ExternalResources.js +26 -26
  166. package/dist/esm/Feature.js +3 -3
  167. package/dist/esm/ForbesHero.js +7 -7
  168. package/dist/esm/GridContent.js +30 -30
  169. package/dist/esm/GridHero.js +7 -7
  170. package/dist/esm/GroupDeck.js +9 -9
  171. package/dist/esm/HamMagazine.js +21 -21
  172. package/dist/esm/Hero.js +1 -1
  173. package/dist/esm/HorizontalArticleListing.js +25 -25
  174. package/dist/esm/HorizontalHero.js +1 -1
  175. package/dist/esm/IssueContentDeck.js +7 -7
  176. package/dist/esm/IssueDeck.js +10 -10
  177. package/dist/esm/IssueLanding.js +49 -49
  178. package/dist/esm/KMTracker.js +15 -15
  179. package/dist/esm/LeftNav.js +14 -14
  180. package/dist/esm/MasterDeck.js +32 -32
  181. package/dist/esm/MediaSeriesLanding.js +405 -396
  182. package/dist/esm/NavDvm.js +7 -7
  183. package/dist/esm/NavMagazine.js +21 -21
  184. package/dist/esm/NavNative.js +26 -26
  185. package/dist/esm/NavNormal.js +7 -7
  186. package/dist/esm/OncliveHero.js +1 -1
  187. package/dist/esm/OncliveLargeHero.js +7 -7
  188. package/dist/esm/PageFilter.js +5 -5
  189. package/dist/esm/PartnerDetailListing.js +29 -29
  190. package/dist/esm/PopUpModal.js +5 -5
  191. package/dist/esm/PubSection.js +20 -20
  192. package/dist/esm/PubToc.js +7 -7
  193. package/dist/esm/PublicationDeck.js +2 -2
  194. package/dist/esm/PublicationLanding.js +49 -49
  195. package/dist/esm/QueueDeckExpanded.js +22 -22
  196. package/dist/esm/RecentNews.js +1 -1
  197. package/dist/esm/RelatedContent.js +29 -29
  198. package/dist/esm/RelatedTopicsDropdown.js +10 -10
  199. package/dist/esm/Search.js +5 -5
  200. package/dist/esm/Segment.js +6 -6
  201. package/dist/esm/SeriesListingDeck.js +12 -12
  202. package/dist/esm/{SeriesSlider-291e1c9e.js → SeriesSlider-8414085b.js} +12 -12
  203. package/dist/esm/SideFooter.js +13 -13
  204. package/dist/esm/{SocialSearchComponent-c3216d1a.js → SocialSearchComponent-116b1d5d.js} +6 -6
  205. package/dist/esm/TaxonomyCard.js +5 -5
  206. package/dist/esm/TaxonomyDescription.js +25 -25
  207. package/dist/esm/TemplateNormal.js +19 -19
  208. package/dist/esm/ThumbnailCard.js +1 -1
  209. package/dist/esm/Ustream.js +7 -7
  210. package/dist/esm/VerticalHero.js +1 -1
  211. package/dist/esm/VideoProgramLandingPage.js +25 -25
  212. package/dist/esm/VideoSeriesCard.js +8 -8
  213. package/dist/esm/VideoSeriesFilter.js +7 -7
  214. package/dist/esm/VideoSeriesLandingPage.js +24 -24
  215. package/dist/esm/VideoSeriesListing.js +17 -17
  216. package/dist/esm/View.js +40 -40
  217. package/dist/esm/YahooHero.js +7 -7
  218. package/dist/esm/YoutubeGroup.js +19 -19
  219. package/dist/esm/{_is-array-674f71ec.js → _is-array-3e99e06e.js} +1 -1
  220. package/dist/esm/{_iter-detect-48516cd3.js → _iter-detect-7e5e5ce2.js} +8 -8
  221. package/dist/esm/{_object-pie-33c40e79.js → _object-pie-133f504a.js} +4 -4
  222. package/dist/esm/{_object-sap-fd3054d0.js → _object-sap-f353c2a9.js} +1 -1
  223. package/dist/esm/{_object-to-array-8f409e54.js → _object-to-array-0f197f89.js} +2 -2
  224. package/dist/esm/{_to-object-97770c52.js → _to-object-b50e61c3.js} +4 -4
  225. package/dist/esm/{asyncToGenerator-585841c0.js → asyncToGenerator-7f8f9219.js} +30 -30
  226. package/dist/esm/{core.get-iterator-method-d1d5ed02.js → core.get-iterator-method-133dfacd.js} +2 -2
  227. package/dist/esm/{debounce-9207d8ee.js → debounce-533d9748.js} +2 -2
  228. package/dist/esm/{define-property-ec6d528d.js → define-property-fe54dc9f.js} +6 -6
  229. package/dist/esm/{defineProperty-ea516b15.js → defineProperty-f5ff6f5a.js} +1 -1
  230. package/dist/esm/empty-81a1dbdc.js +3 -0
  231. package/dist/esm/{eq-b470f743.js → eq-bdcbf886.js} +1 -1
  232. package/dist/esm/{es6.string.iterator-aa6068a3.js → es6.string.iterator-bc33758b.js} +5 -5
  233. package/dist/esm/{extends-31d65aba.js → extends-60e0e1c6.js} +8 -8
  234. package/dist/esm/faundadb.js +1631 -0
  235. package/dist/esm/{get-1e515072.js → get-3c308da4.js} +21 -21
  236. package/dist/esm/getRelatedArticle.js +11 -9
  237. package/dist/esm/getRootDocGroup.js +6 -6
  238. package/dist/esm/getSerializers.js +25 -25
  239. package/dist/esm/{getTargeting-2d402d66.js → getTargeting-d0d71a56.js} +11 -11
  240. package/dist/esm/getTargeting.js +8 -8
  241. package/dist/esm/{index-3f5c03b2.js → index-0dbff1d1.js} +5 -5
  242. package/dist/esm/{index-f4fe5a50.js → index-20026f92.js} +340 -90
  243. package/dist/esm/{index-ccb770c7.js → index-79cfd25c.js} +4 -4
  244. package/dist/esm/index.js +37 -37
  245. package/dist/esm/{inherits-5906fbea.js → inherits-a41fe93f.js} +20 -20
  246. package/dist/esm/inheritsLoose-8f901617.js +16 -0
  247. package/dist/esm/{isSymbol-1981418f.js → isSymbol-a7e9aafe.js} +15 -15
  248. package/dist/esm/{keys-a0b0c7a4.js → keys-7a3adabf.js} +6 -6
  249. package/dist/esm/{lodash-ad27652f.js → lodash-f97fd99a.js} +57 -9
  250. package/dist/esm/{main-1450d277.js → main-b5c5aac1.js} +178 -103
  251. package/dist/esm/{slicedToArray-cdeaee08.js → slicedToArray-be2f7a22.js} +14 -14
  252. package/dist/esm/stringify-59c8f690.js +15 -0
  253. package/dist/esm/{toConsumableArray-fa2dcda7.js → toConsumableArray-6d9a4616.js} +9 -9
  254. package/dist/esm/{toNumber-2f7a84cd.js → toNumber-5aeba6e7.js} +40 -5
  255. package/dist/esm/{typeof-e9cea9e8.js → typeof-a286cf0c.js} +34 -34
  256. package/dist/esm/urlFor.js +1 -1
  257. package/dist/esm/{web.dom.iterable-035980f3.js → web.dom.iterable-4109ff68.js} +2 -2
  258. package/package.json +111 -108
  259. package/dist/cjs/keys-95c064c9.js +0 -25
  260. package/dist/cjs/stringify-01cf47f7.js +0 -17
  261. package/dist/esm/stringify-d4839bab.js +0 -15
@@ -0,0 +1,1637 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var asyncToGenerator = require('./asyncToGenerator-58c289d9.js');
6
+ var _commonjsHelpers = require('./_commonjsHelpers-06173234.js');
7
+ var empty = require('./empty-7d04c64b.js');
8
+ require('./es6.string.iterator-c2573ffd.js');
9
+ require('./_to-object-6de10e57.js');
10
+ require('./web.dom.iterable-46657b5c.js');
11
+ require('./_library-dd23b178.js');
12
+ require('./core.get-iterator-method-f474eacc.js');
13
+ require('./_iter-detect-55a5657a.js');
14
+
15
+ var bcrypt = _commonjsHelpers.createCommonjsModule(function (module) {
16
+ /*
17
+ Copyright (c) 2012 Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
18
+ Copyright (c) 2012 Shane Girish <shaneGirish@gmail.com>
19
+ Copyright (c) 2014 Daniel Wirtz <dcode@dcode.io>
20
+
21
+ Redistribution and use in source and binary forms, with or without
22
+ modification, are permitted provided that the following conditions
23
+ are met:
24
+ 1. Redistributions of source code must retain the above copyright
25
+ notice, this list of conditions and the following disclaimer.
26
+ 2. Redistributions in binary form must reproduce the above copyright
27
+ notice, this list of conditions and the following disclaimer in the
28
+ documentation and/or other materials provided with the distribution.
29
+ 3. The name of the author may not be used to endorse or promote products
30
+ derived from this software without specific prior written permission.
31
+
32
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
33
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
34
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
35
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
36
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
37
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
38
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
39
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
40
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
41
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42
+ */
43
+
44
+ /**
45
+ * @license bcrypt.js (c) 2013 Daniel Wirtz <dcode@dcode.io>
46
+ * Released under the Apache License, Version 2.0
47
+ * see: https://github.com/dcodeIO/bcrypt.js for details
48
+ */
49
+ (function(global, factory) {
50
+
51
+ /* AMD */ if (typeof _commonjsHelpers.commonjsRequire === 'function' && 'object' === "object" && module && module["exports"])
52
+ module["exports"] = factory();
53
+ /* Global */ else
54
+ (global["dcodeIO"] = global["dcodeIO"] || {})["bcrypt"] = factory();
55
+
56
+ }(_commonjsHelpers.commonjsGlobal, function() {
57
+
58
+ /**
59
+ * bcrypt namespace.
60
+ * @type {Object.<string,*>}
61
+ */
62
+ var bcrypt = {};
63
+
64
+ /**
65
+ * The random implementation to use as a fallback.
66
+ * @type {?function(number):!Array.<number>}
67
+ * @inner
68
+ */
69
+ var randomFallback = null;
70
+
71
+ /**
72
+ * Generates cryptographically secure random bytes.
73
+ * @function
74
+ * @param {number} len Bytes length
75
+ * @returns {!Array.<number>} Random bytes
76
+ * @throws {Error} If no random implementation is available
77
+ * @inner
78
+ */
79
+ function random(len) {
80
+ /* node */ if (module && module['exports'])
81
+ try {
82
+ return empty.require$$0['randomBytes'](len);
83
+ } catch (e) {}
84
+ /* WCA */ try {
85
+ var a; (self['crypto']||self['msCrypto'])['getRandomValues'](a = new Uint32Array(len));
86
+ return Array.prototype.slice.call(a);
87
+ } catch (e) {}
88
+ /* fallback */ if (!randomFallback)
89
+ throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative");
90
+ return randomFallback(len);
91
+ }
92
+
93
+ // Test if any secure randomness source is available
94
+ var randomAvailable = false;
95
+ try {
96
+ random(1);
97
+ randomAvailable = true;
98
+ } catch (e) {}
99
+
100
+ // Default fallback, if any
101
+ randomFallback = null;
102
+ /**
103
+ * Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto
104
+ * API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it
105
+ * is seeded properly!
106
+ * @param {?function(number):!Array.<number>} random Function taking the number of bytes to generate as its
107
+ * sole argument, returning the corresponding array of cryptographically secure random byte values.
108
+ * @see http://nodejs.org/api/crypto.html
109
+ * @see http://www.w3.org/TR/WebCryptoAPI/
110
+ */
111
+ bcrypt.setRandomFallback = function(random) {
112
+ randomFallback = random;
113
+ };
114
+
115
+ /**
116
+ * Synchronously generates a salt.
117
+ * @param {number=} rounds Number of rounds to use, defaults to 10 if omitted
118
+ * @param {number=} seed_length Not supported.
119
+ * @returns {string} Resulting salt
120
+ * @throws {Error} If a random fallback is required but not set
121
+ * @expose
122
+ */
123
+ bcrypt.genSaltSync = function(rounds, seed_length) {
124
+ rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS;
125
+ if (typeof rounds !== 'number')
126
+ throw Error("Illegal arguments: "+(typeof rounds)+", "+(typeof seed_length));
127
+ if (rounds < 4)
128
+ rounds = 4;
129
+ else if (rounds > 31)
130
+ rounds = 31;
131
+ var salt = [];
132
+ salt.push("$2a$");
133
+ if (rounds < 10)
134
+ salt.push("0");
135
+ salt.push(rounds.toString());
136
+ salt.push('$');
137
+ salt.push(base64_encode(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw
138
+ return salt.join('');
139
+ };
140
+
141
+ /**
142
+ * Asynchronously generates a salt.
143
+ * @param {(number|function(Error, string=))=} rounds Number of rounds to use, defaults to 10 if omitted
144
+ * @param {(number|function(Error, string=))=} seed_length Not supported.
145
+ * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt
146
+ * @returns {!Promise} If `callback` has been omitted
147
+ * @throws {Error} If `callback` is present but not a function
148
+ * @expose
149
+ */
150
+ bcrypt.genSalt = function(rounds, seed_length, callback) {
151
+ if (typeof seed_length === 'function')
152
+ callback = seed_length,
153
+ seed_length = undefined; // Not supported.
154
+ if (typeof rounds === 'function')
155
+ callback = rounds,
156
+ rounds = undefined;
157
+ if (typeof rounds === 'undefined')
158
+ rounds = GENSALT_DEFAULT_LOG2_ROUNDS;
159
+ else if (typeof rounds !== 'number')
160
+ throw Error("illegal arguments: "+(typeof rounds));
161
+
162
+ function _async(callback) {
163
+ nextTick(function() { // Pretty thin, but salting is fast enough
164
+ try {
165
+ callback(null, bcrypt.genSaltSync(rounds));
166
+ } catch (err) {
167
+ callback(err);
168
+ }
169
+ });
170
+ }
171
+
172
+ if (callback) {
173
+ if (typeof callback !== 'function')
174
+ throw Error("Illegal callback: "+typeof(callback));
175
+ _async(callback);
176
+ } else
177
+ return new Promise(function(resolve, reject) {
178
+ _async(function(err, res) {
179
+ if (err) {
180
+ reject(err);
181
+ return;
182
+ }
183
+ resolve(res);
184
+ });
185
+ });
186
+ };
187
+
188
+ /**
189
+ * Synchronously generates a hash for the given string.
190
+ * @param {string} s String to hash
191
+ * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10
192
+ * @returns {string} Resulting hash
193
+ * @expose
194
+ */
195
+ bcrypt.hashSync = function(s, salt) {
196
+ if (typeof salt === 'undefined')
197
+ salt = GENSALT_DEFAULT_LOG2_ROUNDS;
198
+ if (typeof salt === 'number')
199
+ salt = bcrypt.genSaltSync(salt);
200
+ if (typeof s !== 'string' || typeof salt !== 'string')
201
+ throw Error("Illegal arguments: "+(typeof s)+', '+(typeof salt));
202
+ return _hash(s, salt);
203
+ };
204
+
205
+ /**
206
+ * Asynchronously generates a hash for the given string.
207
+ * @param {string} s String to hash
208
+ * @param {number|string} salt Salt length to generate or salt to use
209
+ * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash
210
+ * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed
211
+ * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
212
+ * @returns {!Promise} If `callback` has been omitted
213
+ * @throws {Error} If `callback` is present but not a function
214
+ * @expose
215
+ */
216
+ bcrypt.hash = function(s, salt, callback, progressCallback) {
217
+
218
+ function _async(callback) {
219
+ if (typeof s === 'string' && typeof salt === 'number')
220
+ bcrypt.genSalt(salt, function(err, salt) {
221
+ _hash(s, salt, callback, progressCallback);
222
+ });
223
+ else if (typeof s === 'string' && typeof salt === 'string')
224
+ _hash(s, salt, callback, progressCallback);
225
+ else
226
+ nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof salt))));
227
+ }
228
+
229
+ if (callback) {
230
+ if (typeof callback !== 'function')
231
+ throw Error("Illegal callback: "+typeof(callback));
232
+ _async(callback);
233
+ } else
234
+ return new Promise(function(resolve, reject) {
235
+ _async(function(err, res) {
236
+ if (err) {
237
+ reject(err);
238
+ return;
239
+ }
240
+ resolve(res);
241
+ });
242
+ });
243
+ };
244
+
245
+ /**
246
+ * Compares two strings of the same length in constant time.
247
+ * @param {string} known Must be of the correct length
248
+ * @param {string} unknown Must be the same length as `known`
249
+ * @returns {boolean}
250
+ * @inner
251
+ */
252
+ function safeStringCompare(known, unknown) {
253
+ var right = 0,
254
+ wrong = 0;
255
+ for (var i=0, k=known.length; i<k; ++i) {
256
+ if (known.charCodeAt(i) === unknown.charCodeAt(i))
257
+ ++right;
258
+ else
259
+ ++wrong;
260
+ }
261
+ // Prevent removal of unused variables (never true, actually)
262
+ if (right < 0)
263
+ return false;
264
+ return wrong === 0;
265
+ }
266
+
267
+ /**
268
+ * Synchronously tests a string against a hash.
269
+ * @param {string} s String to compare
270
+ * @param {string} hash Hash to test against
271
+ * @returns {boolean} true if matching, otherwise false
272
+ * @throws {Error} If an argument is illegal
273
+ * @expose
274
+ */
275
+ bcrypt.compareSync = function(s, hash) {
276
+ if (typeof s !== "string" || typeof hash !== "string")
277
+ throw Error("Illegal arguments: "+(typeof s)+', '+(typeof hash));
278
+ if (hash.length !== 60)
279
+ return false;
280
+ return safeStringCompare(bcrypt.hashSync(s, hash.substr(0, hash.length-31)), hash);
281
+ };
282
+
283
+ /**
284
+ * Asynchronously compares the given data against the given hash.
285
+ * @param {string} s Data to compare
286
+ * @param {string} hash Data to be compared to
287
+ * @param {function(Error, boolean)=} callback Callback receiving the error, if any, otherwise the result
288
+ * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed
289
+ * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
290
+ * @returns {!Promise} If `callback` has been omitted
291
+ * @throws {Error} If `callback` is present but not a function
292
+ * @expose
293
+ */
294
+ bcrypt.compare = function(s, hash, callback, progressCallback) {
295
+
296
+ function _async(callback) {
297
+ if (typeof s !== "string" || typeof hash !== "string") {
298
+ nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof hash))));
299
+ return;
300
+ }
301
+ if (hash.length !== 60) {
302
+ nextTick(callback.bind(this, null, false));
303
+ return;
304
+ }
305
+ bcrypt.hash(s, hash.substr(0, 29), function(err, comp) {
306
+ if (err)
307
+ callback(err);
308
+ else
309
+ callback(null, safeStringCompare(comp, hash));
310
+ }, progressCallback);
311
+ }
312
+
313
+ if (callback) {
314
+ if (typeof callback !== 'function')
315
+ throw Error("Illegal callback: "+typeof(callback));
316
+ _async(callback);
317
+ } else
318
+ return new Promise(function(resolve, reject) {
319
+ _async(function(err, res) {
320
+ if (err) {
321
+ reject(err);
322
+ return;
323
+ }
324
+ resolve(res);
325
+ });
326
+ });
327
+ };
328
+
329
+ /**
330
+ * Gets the number of rounds used to encrypt the specified hash.
331
+ * @param {string} hash Hash to extract the used number of rounds from
332
+ * @returns {number} Number of rounds used
333
+ * @throws {Error} If `hash` is not a string
334
+ * @expose
335
+ */
336
+ bcrypt.getRounds = function(hash) {
337
+ if (typeof hash !== "string")
338
+ throw Error("Illegal arguments: "+(typeof hash));
339
+ return parseInt(hash.split("$")[2], 10);
340
+ };
341
+
342
+ /**
343
+ * Gets the salt portion from a hash. Does not validate the hash.
344
+ * @param {string} hash Hash to extract the salt from
345
+ * @returns {string} Extracted salt part
346
+ * @throws {Error} If `hash` is not a string or otherwise invalid
347
+ * @expose
348
+ */
349
+ bcrypt.getSalt = function(hash) {
350
+ if (typeof hash !== 'string')
351
+ throw Error("Illegal arguments: "+(typeof hash));
352
+ if (hash.length !== 60)
353
+ throw Error("Illegal hash length: "+hash.length+" != 60");
354
+ return hash.substring(0, 29);
355
+ };
356
+
357
+ /**
358
+ * Continues with the callback on the next tick.
359
+ * @function
360
+ * @param {function(...[*])} callback Callback to execute
361
+ * @inner
362
+ */
363
+ var nextTick = typeof process !== 'undefined' && process && typeof process.nextTick === 'function'
364
+ ? (typeof setImmediate === 'function' ? setImmediate : process.nextTick)
365
+ : setTimeout;
366
+
367
+ /**
368
+ * Converts a JavaScript string to UTF8 bytes.
369
+ * @param {string} str String
370
+ * @returns {!Array.<number>} UTF8 bytes
371
+ * @inner
372
+ */
373
+ function stringToBytes(str) {
374
+ var out = [],
375
+ i = 0;
376
+ utfx.encodeUTF16toUTF8(function() {
377
+ if (i >= str.length) return null;
378
+ return str.charCodeAt(i++);
379
+ }, function(b) {
380
+ out.push(b);
381
+ });
382
+ return out;
383
+ }
384
+
385
+ // A base64 implementation for the bcrypt algorithm. This is partly non-standard.
386
+
387
+ /**
388
+ * bcrypt's own non-standard base64 dictionary.
389
+ * @type {!Array.<string>}
390
+ * @const
391
+ * @inner
392
+ **/
393
+ var BASE64_CODE = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split('');
394
+
395
+ /**
396
+ * @type {!Array.<number>}
397
+ * @const
398
+ * @inner
399
+ **/
400
+ var BASE64_INDEX = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
401
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
402
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,
403
+ 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1,
404
+ -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
405
+ 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30,
406
+ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
407
+ 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1];
408
+
409
+ /**
410
+ * @type {!function(...number):string}
411
+ * @inner
412
+ */
413
+ var stringFromCharCode = String.fromCharCode;
414
+
415
+ /**
416
+ * Encodes a byte array to base64 with up to len bytes of input.
417
+ * @param {!Array.<number>} b Byte array
418
+ * @param {number} len Maximum input length
419
+ * @returns {string}
420
+ * @inner
421
+ */
422
+ function base64_encode(b, len) {
423
+ var off = 0,
424
+ rs = [],
425
+ c1, c2;
426
+ if (len <= 0 || len > b.length)
427
+ throw Error("Illegal len: "+len);
428
+ while (off < len) {
429
+ c1 = b[off++] & 0xff;
430
+ rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]);
431
+ c1 = (c1 & 0x03) << 4;
432
+ if (off >= len) {
433
+ rs.push(BASE64_CODE[c1 & 0x3f]);
434
+ break;
435
+ }
436
+ c2 = b[off++] & 0xff;
437
+ c1 |= (c2 >> 4) & 0x0f;
438
+ rs.push(BASE64_CODE[c1 & 0x3f]);
439
+ c1 = (c2 & 0x0f) << 2;
440
+ if (off >= len) {
441
+ rs.push(BASE64_CODE[c1 & 0x3f]);
442
+ break;
443
+ }
444
+ c2 = b[off++] & 0xff;
445
+ c1 |= (c2 >> 6) & 0x03;
446
+ rs.push(BASE64_CODE[c1 & 0x3f]);
447
+ rs.push(BASE64_CODE[c2 & 0x3f]);
448
+ }
449
+ return rs.join('');
450
+ }
451
+
452
+ /**
453
+ * Decodes a base64 encoded string to up to len bytes of output.
454
+ * @param {string} s String to decode
455
+ * @param {number} len Maximum output length
456
+ * @returns {!Array.<number>}
457
+ * @inner
458
+ */
459
+ function base64_decode(s, len) {
460
+ var off = 0,
461
+ slen = s.length,
462
+ olen = 0,
463
+ rs = [],
464
+ c1, c2, c3, c4, o, code;
465
+ if (len <= 0)
466
+ throw Error("Illegal len: "+len);
467
+ while (off < slen - 1 && olen < len) {
468
+ code = s.charCodeAt(off++);
469
+ c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
470
+ code = s.charCodeAt(off++);
471
+ c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
472
+ if (c1 == -1 || c2 == -1)
473
+ break;
474
+ o = (c1 << 2) >>> 0;
475
+ o |= (c2 & 0x30) >> 4;
476
+ rs.push(stringFromCharCode(o));
477
+ if (++olen >= len || off >= slen)
478
+ break;
479
+ code = s.charCodeAt(off++);
480
+ c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
481
+ if (c3 == -1)
482
+ break;
483
+ o = ((c2 & 0x0f) << 4) >>> 0;
484
+ o |= (c3 & 0x3c) >> 2;
485
+ rs.push(stringFromCharCode(o));
486
+ if (++olen >= len || off >= slen)
487
+ break;
488
+ code = s.charCodeAt(off++);
489
+ c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
490
+ o = ((c3 & 0x03) << 6) >>> 0;
491
+ o |= c4;
492
+ rs.push(stringFromCharCode(o));
493
+ ++olen;
494
+ }
495
+ var res = [];
496
+ for (off = 0; off<olen; off++)
497
+ res.push(rs[off].charCodeAt(0));
498
+ return res;
499
+ }
500
+
501
+ /**
502
+ * utfx-embeddable (c) 2014 Daniel Wirtz <dcode@dcode.io>
503
+ * Released under the Apache License, Version 2.0
504
+ * see: https://github.com/dcodeIO/utfx for details
505
+ */
506
+ var utfx = function() {
507
+
508
+ /**
509
+ * utfx namespace.
510
+ * @inner
511
+ * @type {!Object.<string,*>}
512
+ */
513
+ var utfx = {};
514
+
515
+ /**
516
+ * Maximum valid code point.
517
+ * @type {number}
518
+ * @const
519
+ */
520
+ utfx.MAX_CODEPOINT = 0x10FFFF;
521
+
522
+ /**
523
+ * Encodes UTF8 code points to UTF8 bytes.
524
+ * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point
525
+ * respectively `null` if there are no more code points left or a single numeric code point.
526
+ * @param {!function(number)} dst Bytes destination as a function successively called with the next byte
527
+ */
528
+ utfx.encodeUTF8 = function(src, dst) {
529
+ var cp = null;
530
+ if (typeof src === 'number')
531
+ cp = src,
532
+ src = function() { return null; };
533
+ while (cp !== null || (cp = src()) !== null) {
534
+ if (cp < 0x80)
535
+ dst(cp&0x7F);
536
+ else if (cp < 0x800)
537
+ dst(((cp>>6)&0x1F)|0xC0),
538
+ dst((cp&0x3F)|0x80);
539
+ else if (cp < 0x10000)
540
+ dst(((cp>>12)&0x0F)|0xE0),
541
+ dst(((cp>>6)&0x3F)|0x80),
542
+ dst((cp&0x3F)|0x80);
543
+ else
544
+ dst(((cp>>18)&0x07)|0xF0),
545
+ dst(((cp>>12)&0x3F)|0x80),
546
+ dst(((cp>>6)&0x3F)|0x80),
547
+ dst((cp&0x3F)|0x80);
548
+ cp = null;
549
+ }
550
+ };
551
+
552
+ /**
553
+ * Decodes UTF8 bytes to UTF8 code points.
554
+ * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there
555
+ * are no more bytes left.
556
+ * @param {!function(number)} dst Code points destination as a function successively called with each decoded code point.
557
+ * @throws {RangeError} If a starting byte is invalid in UTF8
558
+ * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the
559
+ * remaining bytes.
560
+ */
561
+ utfx.decodeUTF8 = function(src, dst) {
562
+ var a, b, c, d, fail = function(b) {
563
+ b = b.slice(0, b.indexOf(null));
564
+ var err = Error(b.toString());
565
+ err.name = "TruncatedError";
566
+ err['bytes'] = b;
567
+ throw err;
568
+ };
569
+ while ((a = src()) !== null) {
570
+ if ((a&0x80) === 0)
571
+ dst(a);
572
+ else if ((a&0xE0) === 0xC0)
573
+ ((b = src()) === null) && fail([a, b]),
574
+ dst(((a&0x1F)<<6) | (b&0x3F));
575
+ else if ((a&0xF0) === 0xE0)
576
+ ((b=src()) === null || (c=src()) === null) && fail([a, b, c]),
577
+ dst(((a&0x0F)<<12) | ((b&0x3F)<<6) | (c&0x3F));
578
+ else if ((a&0xF8) === 0xF0)
579
+ ((b=src()) === null || (c=src()) === null || (d=src()) === null) && fail([a, b, c ,d]),
580
+ dst(((a&0x07)<<18) | ((b&0x3F)<<12) | ((c&0x3F)<<6) | (d&0x3F));
581
+ else throw RangeError("Illegal starting byte: "+a);
582
+ }
583
+ };
584
+
585
+ /**
586
+ * Converts UTF16 characters to UTF8 code points.
587
+ * @param {!function():number|null} src Characters source as a function returning the next char code respectively
588
+ * `null` if there are no more characters left.
589
+ * @param {!function(number)} dst Code points destination as a function successively called with each converted code
590
+ * point.
591
+ */
592
+ utfx.UTF16toUTF8 = function(src, dst) {
593
+ var c1, c2 = null;
594
+ while (true) {
595
+ if ((c1 = c2 !== null ? c2 : src()) === null)
596
+ break;
597
+ if (c1 >= 0xD800 && c1 <= 0xDFFF) {
598
+ if ((c2 = src()) !== null) {
599
+ if (c2 >= 0xDC00 && c2 <= 0xDFFF) {
600
+ dst((c1-0xD800)*0x400+c2-0xDC00+0x10000);
601
+ c2 = null; continue;
602
+ }
603
+ }
604
+ }
605
+ dst(c1);
606
+ }
607
+ if (c2 !== null) dst(c2);
608
+ };
609
+
610
+ /**
611
+ * Converts UTF8 code points to UTF16 characters.
612
+ * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point
613
+ * respectively `null` if there are no more code points left or a single numeric code point.
614
+ * @param {!function(number)} dst Characters destination as a function successively called with each converted char code.
615
+ * @throws {RangeError} If a code point is out of range
616
+ */
617
+ utfx.UTF8toUTF16 = function(src, dst) {
618
+ var cp = null;
619
+ if (typeof src === 'number')
620
+ cp = src, src = function() { return null; };
621
+ while (cp !== null || (cp = src()) !== null) {
622
+ if (cp <= 0xFFFF)
623
+ dst(cp);
624
+ else
625
+ cp -= 0x10000,
626
+ dst((cp>>10)+0xD800),
627
+ dst((cp%0x400)+0xDC00);
628
+ cp = null;
629
+ }
630
+ };
631
+
632
+ /**
633
+ * Converts and encodes UTF16 characters to UTF8 bytes.
634
+ * @param {!function():number|null} src Characters source as a function returning the next char code respectively `null`
635
+ * if there are no more characters left.
636
+ * @param {!function(number)} dst Bytes destination as a function successively called with the next byte.
637
+ */
638
+ utfx.encodeUTF16toUTF8 = function(src, dst) {
639
+ utfx.UTF16toUTF8(src, function(cp) {
640
+ utfx.encodeUTF8(cp, dst);
641
+ });
642
+ };
643
+
644
+ /**
645
+ * Decodes and converts UTF8 bytes to UTF16 characters.
646
+ * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there
647
+ * are no more bytes left.
648
+ * @param {!function(number)} dst Characters destination as a function successively called with each converted char code.
649
+ * @throws {RangeError} If a starting byte is invalid in UTF8
650
+ * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the remaining bytes.
651
+ */
652
+ utfx.decodeUTF8toUTF16 = function(src, dst) {
653
+ utfx.decodeUTF8(src, function(cp) {
654
+ utfx.UTF8toUTF16(cp, dst);
655
+ });
656
+ };
657
+
658
+ /**
659
+ * Calculates the byte length of an UTF8 code point.
660
+ * @param {number} cp UTF8 code point
661
+ * @returns {number} Byte length
662
+ */
663
+ utfx.calculateCodePoint = function(cp) {
664
+ return (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4;
665
+ };
666
+
667
+ /**
668
+ * Calculates the number of UTF8 bytes required to store UTF8 code points.
669
+ * @param {(!function():number|null)} src Code points source as a function returning the next code point respectively
670
+ * `null` if there are no more code points left.
671
+ * @returns {number} The number of UTF8 bytes required
672
+ */
673
+ utfx.calculateUTF8 = function(src) {
674
+ var cp, l=0;
675
+ while ((cp = src()) !== null)
676
+ l += utfx.calculateCodePoint(cp);
677
+ return l;
678
+ };
679
+
680
+ /**
681
+ * Calculates the number of UTF8 code points respectively UTF8 bytes required to store UTF16 char codes.
682
+ * @param {(!function():number|null)} src Characters source as a function returning the next char code respectively
683
+ * `null` if there are no more characters left.
684
+ * @returns {!Array.<number>} The number of UTF8 code points at index 0 and the number of UTF8 bytes required at index 1.
685
+ */
686
+ utfx.calculateUTF16asUTF8 = function(src) {
687
+ var n=0, l=0;
688
+ utfx.UTF16toUTF8(src, function(cp) {
689
+ ++n; l += utfx.calculateCodePoint(cp);
690
+ });
691
+ return [n,l];
692
+ };
693
+
694
+ return utfx;
695
+ }();
696
+
697
+ Date.now = Date.now || function() { return +new Date; };
698
+
699
+ /**
700
+ * @type {number}
701
+ * @const
702
+ * @inner
703
+ */
704
+ var BCRYPT_SALT_LEN = 16;
705
+
706
+ /**
707
+ * @type {number}
708
+ * @const
709
+ * @inner
710
+ */
711
+ var GENSALT_DEFAULT_LOG2_ROUNDS = 10;
712
+
713
+ /**
714
+ * @type {number}
715
+ * @const
716
+ * @inner
717
+ */
718
+ var BLOWFISH_NUM_ROUNDS = 16;
719
+
720
+ /**
721
+ * @type {number}
722
+ * @const
723
+ * @inner
724
+ */
725
+ var MAX_EXECUTION_TIME = 100;
726
+
727
+ /**
728
+ * @type {Array.<number>}
729
+ * @const
730
+ * @inner
731
+ */
732
+ var P_ORIG = [
733
+ 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822,
734
+ 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377,
735
+ 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5,
736
+ 0xb5470917, 0x9216d5d9, 0x8979fb1b
737
+ ];
738
+
739
+ /**
740
+ * @type {Array.<number>}
741
+ * @const
742
+ * @inner
743
+ */
744
+ var S_ORIG = [
745
+ 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed,
746
+ 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7,
747
+ 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3,
748
+ 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
749
+ 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023,
750
+ 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e,
751
+ 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda,
752
+ 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
753
+ 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af,
754
+ 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6,
755
+ 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381,
756
+ 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
757
+ 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d,
758
+ 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5,
759
+ 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a,
760
+ 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
761
+ 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c,
762
+ 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,
763
+ 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3,
764
+ 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
765
+ 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724,
766
+ 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b,
767
+ 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd,
768
+ 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
769
+ 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f,
770
+ 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd,
771
+ 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39,
772
+ 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
773
+ 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df,
774
+ 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760,
775
+ 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e,
776
+ 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
777
+ 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98,
778
+ 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565,
779
+ 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341,
780
+ 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
781
+ 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0,
782
+ 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64,
783
+ 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191,
784
+ 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
785
+ 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0,
786
+ 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705,
787
+ 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5,
788
+ 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
789
+ 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b,
790
+ 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f,
791
+ 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968,
792
+ 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
793
+ 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5,
794
+ 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6,
795
+ 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799,
796
+ 0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
797
+ 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71,
798
+ 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29,
799
+ 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6,
800
+ 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
801
+ 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f,
802
+ 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286,
803
+ 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec,
804
+ 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
805
+ 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9,
806
+ 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc,
807
+ 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e,
808
+ 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
809
+ 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290,
810
+ 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810,
811
+ 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6,
812
+ 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
813
+ 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847,
814
+ 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451,
815
+ 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6,
816
+ 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
817
+ 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570,
818
+ 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa,
819
+ 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978,
820
+ 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
821
+ 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708,
822
+ 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883,
823
+ 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185,
824
+ 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
825
+ 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830,
826
+ 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239,
827
+ 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab,
828
+ 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
829
+ 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19,
830
+ 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77,
831
+ 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1,
832
+ 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
833
+ 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef,
834
+ 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3,
835
+ 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15,
836
+ 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
837
+ 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2,
838
+ 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492,
839
+ 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174,
840
+ 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
841
+ 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759,
842
+ 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e,
843
+ 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc,
844
+ 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
845
+ 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465,
846
+ 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a,
847
+ 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c,
848
+ 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
849
+ 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e,
850
+ 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af,
851
+ 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0,
852
+ 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
853
+ 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462,
854
+ 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c,
855
+ 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399,
856
+ 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
857
+ 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74,
858
+ 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397,
859
+ 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7,
860
+ 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
861
+ 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802,
862
+ 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22,
863
+ 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4,
864
+ 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
865
+ 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2,
866
+ 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1,
867
+ 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c,
868
+ 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
869
+ 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341,
870
+ 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8,
871
+ 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b,
872
+ 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
873
+ 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88,
874
+ 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979,
875
+ 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc,
876
+ 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
877
+ 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659,
878
+ 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f,
879
+ 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8,
880
+ 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
881
+ 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be,
882
+ 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2,
883
+ 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255,
884
+ 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
885
+ 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1,
886
+ 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09,
887
+ 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025,
888
+ 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
889
+ 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01,
890
+ 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641,
891
+ 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa,
892
+ 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
893
+ 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409,
894
+ 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9,
895
+ 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3,
896
+ 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
897
+ 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234,
898
+ 0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf,
899
+ 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740,
900
+ 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
901
+ 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f,
902
+ 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d,
903
+ 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8,
904
+ 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
905
+ 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba,
906
+ 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1,
907
+ 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69,
908
+ 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
909
+ 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a,
910
+ 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b,
911
+ 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd,
912
+ 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
913
+ 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4,
914
+ 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2,
915
+ 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb,
916
+ 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
917
+ 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751,
918
+ 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
919
+ 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369,
920
+ 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
921
+ 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd,
922
+ 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45,
923
+ 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae,
924
+ 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
925
+ 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08,
926
+ 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d,
927
+ 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b,
928
+ 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
929
+ 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e,
930
+ 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
931
+ 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c,
932
+ 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
933
+ 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361,
934
+ 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c,
935
+ 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be,
936
+ 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
937
+ 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d,
938
+ 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891,
939
+ 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5,
940
+ 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
941
+ 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292,
942
+ 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
943
+ 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2,
944
+ 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
945
+ 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c,
946
+ 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8,
947
+ 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4,
948
+ 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
949
+ 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
950
+ ];
951
+
952
+ /**
953
+ * @type {Array.<number>}
954
+ * @const
955
+ * @inner
956
+ */
957
+ var C_ORIG = [
958
+ 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944,
959
+ 0x6f756274
960
+ ];
961
+
962
+ /**
963
+ * @param {Array.<number>} lr
964
+ * @param {number} off
965
+ * @param {Array.<number>} P
966
+ * @param {Array.<number>} S
967
+ * @returns {Array.<number>}
968
+ * @inner
969
+ */
970
+ function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt
971
+ var n,
972
+ l = lr[off],
973
+ r = lr[off + 1];
974
+
975
+ l ^= P[0];
976
+
977
+ /*
978
+ for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;)
979
+ // Feistel substitution on left word
980
+ n = S[l >>> 24],
981
+ n += S[0x100 | ((l >> 16) & 0xff)],
982
+ n ^= S[0x200 | ((l >> 8) & 0xff)],
983
+ n += S[0x300 | (l & 0xff)],
984
+ r ^= n ^ P[++i],
985
+ // Feistel substitution on right word
986
+ n = S[r >>> 24],
987
+ n += S[0x100 | ((r >> 16) & 0xff)],
988
+ n ^= S[0x200 | ((r >> 8) & 0xff)],
989
+ n += S[0x300 | (r & 0xff)],
990
+ l ^= n ^ P[++i];
991
+ */
992
+
993
+ //The following is an unrolled version of the above loop.
994
+ //Iteration 0
995
+ n = S[l >>> 24];
996
+ n += S[0x100 | ((l >> 16) & 0xff)];
997
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
998
+ n += S[0x300 | (l & 0xff)];
999
+ r ^= n ^ P[1];
1000
+ n = S[r >>> 24];
1001
+ n += S[0x100 | ((r >> 16) & 0xff)];
1002
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
1003
+ n += S[0x300 | (r & 0xff)];
1004
+ l ^= n ^ P[2];
1005
+ //Iteration 1
1006
+ n = S[l >>> 24];
1007
+ n += S[0x100 | ((l >> 16) & 0xff)];
1008
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
1009
+ n += S[0x300 | (l & 0xff)];
1010
+ r ^= n ^ P[3];
1011
+ n = S[r >>> 24];
1012
+ n += S[0x100 | ((r >> 16) & 0xff)];
1013
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
1014
+ n += S[0x300 | (r & 0xff)];
1015
+ l ^= n ^ P[4];
1016
+ //Iteration 2
1017
+ n = S[l >>> 24];
1018
+ n += S[0x100 | ((l >> 16) & 0xff)];
1019
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
1020
+ n += S[0x300 | (l & 0xff)];
1021
+ r ^= n ^ P[5];
1022
+ n = S[r >>> 24];
1023
+ n += S[0x100 | ((r >> 16) & 0xff)];
1024
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
1025
+ n += S[0x300 | (r & 0xff)];
1026
+ l ^= n ^ P[6];
1027
+ //Iteration 3
1028
+ n = S[l >>> 24];
1029
+ n += S[0x100 | ((l >> 16) & 0xff)];
1030
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
1031
+ n += S[0x300 | (l & 0xff)];
1032
+ r ^= n ^ P[7];
1033
+ n = S[r >>> 24];
1034
+ n += S[0x100 | ((r >> 16) & 0xff)];
1035
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
1036
+ n += S[0x300 | (r & 0xff)];
1037
+ l ^= n ^ P[8];
1038
+ //Iteration 4
1039
+ n = S[l >>> 24];
1040
+ n += S[0x100 | ((l >> 16) & 0xff)];
1041
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
1042
+ n += S[0x300 | (l & 0xff)];
1043
+ r ^= n ^ P[9];
1044
+ n = S[r >>> 24];
1045
+ n += S[0x100 | ((r >> 16) & 0xff)];
1046
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
1047
+ n += S[0x300 | (r & 0xff)];
1048
+ l ^= n ^ P[10];
1049
+ //Iteration 5
1050
+ n = S[l >>> 24];
1051
+ n += S[0x100 | ((l >> 16) & 0xff)];
1052
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
1053
+ n += S[0x300 | (l & 0xff)];
1054
+ r ^= n ^ P[11];
1055
+ n = S[r >>> 24];
1056
+ n += S[0x100 | ((r >> 16) & 0xff)];
1057
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
1058
+ n += S[0x300 | (r & 0xff)];
1059
+ l ^= n ^ P[12];
1060
+ //Iteration 6
1061
+ n = S[l >>> 24];
1062
+ n += S[0x100 | ((l >> 16) & 0xff)];
1063
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
1064
+ n += S[0x300 | (l & 0xff)];
1065
+ r ^= n ^ P[13];
1066
+ n = S[r >>> 24];
1067
+ n += S[0x100 | ((r >> 16) & 0xff)];
1068
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
1069
+ n += S[0x300 | (r & 0xff)];
1070
+ l ^= n ^ P[14];
1071
+ //Iteration 7
1072
+ n = S[l >>> 24];
1073
+ n += S[0x100 | ((l >> 16) & 0xff)];
1074
+ n ^= S[0x200 | ((l >> 8) & 0xff)];
1075
+ n += S[0x300 | (l & 0xff)];
1076
+ r ^= n ^ P[15];
1077
+ n = S[r >>> 24];
1078
+ n += S[0x100 | ((r >> 16) & 0xff)];
1079
+ n ^= S[0x200 | ((r >> 8) & 0xff)];
1080
+ n += S[0x300 | (r & 0xff)];
1081
+ l ^= n ^ P[16];
1082
+
1083
+ lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1];
1084
+ lr[off + 1] = l;
1085
+ return lr;
1086
+ }
1087
+
1088
+ /**
1089
+ * @param {Array.<number>} data
1090
+ * @param {number} offp
1091
+ * @returns {{key: number, offp: number}}
1092
+ * @inner
1093
+ */
1094
+ function _streamtoword(data, offp) {
1095
+ for (var i = 0, word = 0; i < 4; ++i)
1096
+ word = (word << 8) | (data[offp] & 0xff),
1097
+ offp = (offp + 1) % data.length;
1098
+ return { key: word, offp: offp };
1099
+ }
1100
+
1101
+ /**
1102
+ * @param {Array.<number>} key
1103
+ * @param {Array.<number>} P
1104
+ * @param {Array.<number>} S
1105
+ * @inner
1106
+ */
1107
+ function _key(key, P, S) {
1108
+ var offset = 0,
1109
+ lr = [0, 0],
1110
+ plen = P.length,
1111
+ slen = S.length,
1112
+ sw;
1113
+ for (var i = 0; i < plen; i++)
1114
+ sw = _streamtoword(key, offset),
1115
+ offset = sw.offp,
1116
+ P[i] = P[i] ^ sw.key;
1117
+ for (i = 0; i < plen; i += 2)
1118
+ lr = _encipher(lr, 0, P, S),
1119
+ P[i] = lr[0],
1120
+ P[i + 1] = lr[1];
1121
+ for (i = 0; i < slen; i += 2)
1122
+ lr = _encipher(lr, 0, P, S),
1123
+ S[i] = lr[0],
1124
+ S[i + 1] = lr[1];
1125
+ }
1126
+
1127
+ /**
1128
+ * Expensive key schedule Blowfish.
1129
+ * @param {Array.<number>} data
1130
+ * @param {Array.<number>} key
1131
+ * @param {Array.<number>} P
1132
+ * @param {Array.<number>} S
1133
+ * @inner
1134
+ */
1135
+ function _ekskey(data, key, P, S) {
1136
+ var offp = 0,
1137
+ lr = [0, 0],
1138
+ plen = P.length,
1139
+ slen = S.length,
1140
+ sw;
1141
+ for (var i = 0; i < plen; i++)
1142
+ sw = _streamtoword(key, offp),
1143
+ offp = sw.offp,
1144
+ P[i] = P[i] ^ sw.key;
1145
+ offp = 0;
1146
+ for (i = 0; i < plen; i += 2)
1147
+ sw = _streamtoword(data, offp),
1148
+ offp = sw.offp,
1149
+ lr[0] ^= sw.key,
1150
+ sw = _streamtoword(data, offp),
1151
+ offp = sw.offp,
1152
+ lr[1] ^= sw.key,
1153
+ lr = _encipher(lr, 0, P, S),
1154
+ P[i] = lr[0],
1155
+ P[i + 1] = lr[1];
1156
+ for (i = 0; i < slen; i += 2)
1157
+ sw = _streamtoword(data, offp),
1158
+ offp = sw.offp,
1159
+ lr[0] ^= sw.key,
1160
+ sw = _streamtoword(data, offp),
1161
+ offp = sw.offp,
1162
+ lr[1] ^= sw.key,
1163
+ lr = _encipher(lr, 0, P, S),
1164
+ S[i] = lr[0],
1165
+ S[i + 1] = lr[1];
1166
+ }
1167
+
1168
+ /**
1169
+ * Internaly crypts a string.
1170
+ * @param {Array.<number>} b Bytes to crypt
1171
+ * @param {Array.<number>} salt Salt bytes to use
1172
+ * @param {number} rounds Number of rounds
1173
+ * @param {function(Error, Array.<number>=)=} callback Callback receiving the error, if any, and the resulting bytes. If
1174
+ * omitted, the operation will be performed synchronously.
1175
+ * @param {function(number)=} progressCallback Callback called with the current progress
1176
+ * @returns {!Array.<number>|undefined} Resulting bytes if callback has been omitted, otherwise `undefined`
1177
+ * @inner
1178
+ */
1179
+ function _crypt(b, salt, rounds, callback, progressCallback) {
1180
+ var cdata = C_ORIG.slice(),
1181
+ clen = cdata.length,
1182
+ err;
1183
+
1184
+ // Validate
1185
+ if (rounds < 4 || rounds > 31) {
1186
+ err = Error("Illegal number of rounds (4-31): "+rounds);
1187
+ if (callback) {
1188
+ nextTick(callback.bind(this, err));
1189
+ return;
1190
+ } else
1191
+ throw err;
1192
+ }
1193
+ if (salt.length !== BCRYPT_SALT_LEN) {
1194
+ err =Error("Illegal salt length: "+salt.length+" != "+BCRYPT_SALT_LEN);
1195
+ if (callback) {
1196
+ nextTick(callback.bind(this, err));
1197
+ return;
1198
+ } else
1199
+ throw err;
1200
+ }
1201
+ rounds = (1 << rounds) >>> 0;
1202
+
1203
+ var P, S, i = 0, j;
1204
+
1205
+ //Use typed arrays when available - huge speedup!
1206
+ if (Int32Array) {
1207
+ P = new Int32Array(P_ORIG);
1208
+ S = new Int32Array(S_ORIG);
1209
+ } else {
1210
+ P = P_ORIG.slice();
1211
+ S = S_ORIG.slice();
1212
+ }
1213
+
1214
+ _ekskey(salt, b, P, S);
1215
+
1216
+ /**
1217
+ * Calcualtes the next round.
1218
+ * @returns {Array.<number>|undefined} Resulting array if callback has been omitted, otherwise `undefined`
1219
+ * @inner
1220
+ */
1221
+ function next() {
1222
+ if (progressCallback)
1223
+ progressCallback(i / rounds);
1224
+ if (i < rounds) {
1225
+ var start = Date.now();
1226
+ for (; i < rounds;) {
1227
+ i = i + 1;
1228
+ _key(b, P, S);
1229
+ _key(salt, P, S);
1230
+ if (Date.now() - start > MAX_EXECUTION_TIME)
1231
+ break;
1232
+ }
1233
+ } else {
1234
+ for (i = 0; i < 64; i++)
1235
+ for (j = 0; j < (clen >> 1); j++)
1236
+ _encipher(cdata, j << 1, P, S);
1237
+ var ret = [];
1238
+ for (i = 0; i < clen; i++)
1239
+ ret.push(((cdata[i] >> 24) & 0xff) >>> 0),
1240
+ ret.push(((cdata[i] >> 16) & 0xff) >>> 0),
1241
+ ret.push(((cdata[i] >> 8) & 0xff) >>> 0),
1242
+ ret.push((cdata[i] & 0xff) >>> 0);
1243
+ if (callback) {
1244
+ callback(null, ret);
1245
+ return;
1246
+ } else
1247
+ return ret;
1248
+ }
1249
+ if (callback)
1250
+ nextTick(next);
1251
+ }
1252
+
1253
+ // Async
1254
+ if (typeof callback !== 'undefined') {
1255
+ next();
1256
+
1257
+ // Sync
1258
+ } else {
1259
+ var res;
1260
+ while (true)
1261
+ if (typeof(res = next()) !== 'undefined')
1262
+ return res || [];
1263
+ }
1264
+ }
1265
+
1266
+ /**
1267
+ * Internally hashes a string.
1268
+ * @param {string} s String to hash
1269
+ * @param {?string} salt Salt to use, actually never null
1270
+ * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted,
1271
+ * hashing is perormed synchronously.
1272
+ * @param {function(number)=} progressCallback Callback called with the current progress
1273
+ * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined`
1274
+ * @inner
1275
+ */
1276
+ function _hash(s, salt, callback, progressCallback) {
1277
+ var err;
1278
+ if (typeof s !== 'string' || typeof salt !== 'string') {
1279
+ err = Error("Invalid string / salt: Not a string");
1280
+ if (callback) {
1281
+ nextTick(callback.bind(this, err));
1282
+ return;
1283
+ }
1284
+ else
1285
+ throw err;
1286
+ }
1287
+
1288
+ // Validate the salt
1289
+ var minor, offset;
1290
+ if (salt.charAt(0) !== '$' || salt.charAt(1) !== '2') {
1291
+ err = Error("Invalid salt version: "+salt.substring(0,2));
1292
+ if (callback) {
1293
+ nextTick(callback.bind(this, err));
1294
+ return;
1295
+ }
1296
+ else
1297
+ throw err;
1298
+ }
1299
+ if (salt.charAt(2) === '$')
1300
+ minor = String.fromCharCode(0),
1301
+ offset = 3;
1302
+ else {
1303
+ minor = salt.charAt(2);
1304
+ if ((minor !== 'a' && minor !== 'b' && minor !== 'y') || salt.charAt(3) !== '$') {
1305
+ err = Error("Invalid salt revision: "+salt.substring(2,4));
1306
+ if (callback) {
1307
+ nextTick(callback.bind(this, err));
1308
+ return;
1309
+ } else
1310
+ throw err;
1311
+ }
1312
+ offset = 4;
1313
+ }
1314
+
1315
+ // Extract number of rounds
1316
+ if (salt.charAt(offset + 2) > '$') {
1317
+ err = Error("Missing salt rounds");
1318
+ if (callback) {
1319
+ nextTick(callback.bind(this, err));
1320
+ return;
1321
+ } else
1322
+ throw err;
1323
+ }
1324
+ var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10,
1325
+ r2 = parseInt(salt.substring(offset + 1, offset + 2), 10),
1326
+ rounds = r1 + r2,
1327
+ real_salt = salt.substring(offset + 3, offset + 25);
1328
+ s += minor >= 'a' ? "\x00" : "";
1329
+
1330
+ var passwordb = stringToBytes(s),
1331
+ saltb = base64_decode(real_salt, BCRYPT_SALT_LEN);
1332
+
1333
+ /**
1334
+ * Finishes hashing.
1335
+ * @param {Array.<number>} bytes Byte array
1336
+ * @returns {string}
1337
+ * @inner
1338
+ */
1339
+ function finish(bytes) {
1340
+ var res = [];
1341
+ res.push("$2");
1342
+ if (minor >= 'a')
1343
+ res.push(minor);
1344
+ res.push("$");
1345
+ if (rounds < 10)
1346
+ res.push("0");
1347
+ res.push(rounds.toString());
1348
+ res.push("$");
1349
+ res.push(base64_encode(saltb, saltb.length));
1350
+ res.push(base64_encode(bytes, C_ORIG.length * 4 - 1));
1351
+ return res.join('');
1352
+ }
1353
+
1354
+ // Sync
1355
+ if (typeof callback == 'undefined')
1356
+ return finish(_crypt(passwordb, saltb, rounds));
1357
+
1358
+ // Async
1359
+ else {
1360
+ _crypt(passwordb, saltb, rounds, function(err, bytes) {
1361
+ if (err)
1362
+ callback(err, null);
1363
+ else
1364
+ callback(null, finish(bytes));
1365
+ }, progressCallback);
1366
+ }
1367
+ }
1368
+
1369
+ /**
1370
+ * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet.
1371
+ * @function
1372
+ * @param {!Array.<number>} b Byte array
1373
+ * @param {number} len Maximum input length
1374
+ * @returns {string}
1375
+ * @expose
1376
+ */
1377
+ bcrypt.encodeBase64 = base64_encode;
1378
+
1379
+ /**
1380
+ * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet.
1381
+ * @function
1382
+ * @param {string} s String to decode
1383
+ * @param {number} len Maximum output length
1384
+ * @returns {!Array.<number>}
1385
+ * @expose
1386
+ */
1387
+ bcrypt.decodeBase64 = base64_decode;
1388
+
1389
+ return bcrypt;
1390
+ }));
1391
+ });
1392
+
1393
+ /*
1394
+ Copyright (c) 2012 Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
1395
+ Copyright (c) 2012 Shane Girish <shaneGirish@gmail.com>
1396
+ Copyright (c) 2013 Daniel Wirtz <dcode@dcode.io>
1397
+
1398
+ Redistribution and use in source and binary forms, with or without
1399
+ modification, are permitted provided that the following conditions
1400
+ are met:
1401
+ 1. Redistributions of source code must retain the above copyright
1402
+ notice, this list of conditions and the following disclaimer.
1403
+ 2. Redistributions in binary form must reproduce the above copyright
1404
+ notice, this list of conditions and the following disclaimer in the
1405
+ documentation and/or other materials provided with the distribution.
1406
+ 3. The name of the author may not be used to endorse or promote products
1407
+ derived from this software without specific prior written permission.
1408
+
1409
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1410
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1411
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1412
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1413
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
1414
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1415
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1416
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1417
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
1418
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1419
+ */
1420
+
1421
+ var bcryptjs = bcrypt;
1422
+
1423
+ var encrypt = function () {
1424
+ var _ref = asyncToGenerator._asyncToGenerator( /*#__PURE__*/asyncToGenerator.regenerator.mark(function _callee(password) {
1425
+ var salt, hashedPassword;
1426
+ return asyncToGenerator.regenerator.wrap(function _callee$(_context) {
1427
+ while (1) {
1428
+ switch (_context.prev = _context.next) {
1429
+ case 0:
1430
+ _context.next = 2;
1431
+ return bcryptjs.genSalt(10);
1432
+
1433
+ case 2:
1434
+ salt = _context.sent;
1435
+ _context.next = 5;
1436
+ return bcryptjs.hash(password, salt);
1437
+
1438
+ case 5:
1439
+ hashedPassword = _context.sent;
1440
+ return _context.abrupt('return', hashedPassword);
1441
+
1442
+ case 7:
1443
+ case 'end':
1444
+ return _context.stop();
1445
+ }
1446
+ }
1447
+ }, _callee, this);
1448
+ }));
1449
+
1450
+ return function encrypt(_x) {
1451
+ return _ref.apply(this, arguments);
1452
+ };
1453
+ }();
1454
+
1455
+ var comparePassword = function () {
1456
+ var _ref2 = asyncToGenerator._asyncToGenerator( /*#__PURE__*/asyncToGenerator.regenerator.mark(function _callee2(plainTextPassword, hashedPassword) {
1457
+ var isAuth;
1458
+ return asyncToGenerator.regenerator.wrap(function _callee2$(_context2) {
1459
+ while (1) {
1460
+ switch (_context2.prev = _context2.next) {
1461
+ case 0:
1462
+ _context2.next = 2;
1463
+ return bcryptjs.compare(plainTextPassword, hashedPassword);
1464
+
1465
+ case 2:
1466
+ isAuth = _context2.sent;
1467
+
1468
+ if (!isAuth.error) {
1469
+ _context2.next = 5;
1470
+ break;
1471
+ }
1472
+
1473
+ throw new Error('failed to compare password');
1474
+
1475
+ case 5:
1476
+ return _context2.abrupt('return', isAuth);
1477
+
1478
+ case 6:
1479
+ case 'end':
1480
+ return _context2.stop();
1481
+ }
1482
+ }
1483
+ }, _callee2, this);
1484
+ }));
1485
+
1486
+ return function comparePassword(_x2, _x3) {
1487
+ return _ref2.apply(this, arguments);
1488
+ };
1489
+ }();
1490
+
1491
+ var faunadb = require('faunadb'),
1492
+ q = faunadb.query;
1493
+ var secret = process.env.FAUNADB_SECRET_KEY; //fnAEGxpmi1ACAISXUnZmc3VG0lr9p6qbkpTrsnmK=
1494
+
1495
+ var registerUser = function () {
1496
+ var _ref = asyncToGenerator._asyncToGenerator( /*#__PURE__*/asyncToGenerator.regenerator.mark(function _callee(body) {
1497
+ var data, client, hashedPassword, result;
1498
+ return asyncToGenerator.regenerator.wrap(function _callee$(_context) {
1499
+ while (1) {
1500
+ switch (_context.prev = _context.next) {
1501
+ case 0:
1502
+ _context.prev = 0;
1503
+ data = body;
1504
+
1505
+ if (secret) {
1506
+ _context.next = 4;
1507
+ break;
1508
+ }
1509
+
1510
+ throw new Error('Missing secret key');
1511
+
1512
+ case 4:
1513
+ client = new faunadb.Client({ secret: secret });
1514
+ _context.next = 7;
1515
+ return encrypt(data.Password);
1516
+
1517
+ case 7:
1518
+ hashedPassword = _context.sent;
1519
+
1520
+ data.Password = hashedPassword;
1521
+ _context.next = 11;
1522
+ return client.query(q.Create(q.Collection('Users'), {
1523
+ data: data
1524
+ }));
1525
+
1526
+ case 11:
1527
+ result = _context.sent;
1528
+
1529
+ if (!(!result.data || result.data.Email != data.Email)) {
1530
+ _context.next = 14;
1531
+ break;
1532
+ }
1533
+
1534
+ throw new Error('Failed to register!');
1535
+
1536
+ case 14:
1537
+ return _context.abrupt('return', result);
1538
+
1539
+ case 17:
1540
+ _context.prev = 17;
1541
+ _context.t0 = _context['catch'](0);
1542
+ return _context.abrupt('return', { error: _context.t0.message });
1543
+
1544
+ case 20:
1545
+ case 'end':
1546
+ return _context.stop();
1547
+ }
1548
+ }
1549
+ }, _callee, this, [[0, 17]]);
1550
+ }));
1551
+
1552
+ return function registerUser(_x) {
1553
+ return _ref.apply(this, arguments);
1554
+ };
1555
+ }();
1556
+
1557
+ var findUserByEmail = function () {
1558
+ var _ref2 = asyncToGenerator._asyncToGenerator( /*#__PURE__*/asyncToGenerator.regenerator.mark(function _callee2(email) {
1559
+ var client, result;
1560
+ return asyncToGenerator.regenerator.wrap(function _callee2$(_context2) {
1561
+ while (1) {
1562
+ switch (_context2.prev = _context2.next) {
1563
+ case 0:
1564
+ _context2.prev = 0;
1565
+ client = new faunadb.Client({ secret: secret });
1566
+ _context2.next = 4;
1567
+ return client.query(q.Get(q.Match(q.Index('Email'), email)));
1568
+
1569
+ case 4:
1570
+ result = _context2.sent;
1571
+ return _context2.abrupt('return', result ? true : false);
1572
+
1573
+ case 8:
1574
+ _context2.prev = 8;
1575
+ _context2.t0 = _context2['catch'](0);
1576
+ return _context2.abrupt('return', false);
1577
+
1578
+ case 11:
1579
+ case 'end':
1580
+ return _context2.stop();
1581
+ }
1582
+ }
1583
+ }, _callee2, this, [[0, 8]]);
1584
+ }));
1585
+
1586
+ return function findUserByEmail(_x2) {
1587
+ return _ref2.apply(this, arguments);
1588
+ };
1589
+ }();
1590
+
1591
+ var authenticateUser = function () {
1592
+ var _ref3 = asyncToGenerator._asyncToGenerator( /*#__PURE__*/asyncToGenerator.regenerator.mark(function _callee3(email, password) {
1593
+ var client, result, hashedPassword, isAuth;
1594
+ return asyncToGenerator.regenerator.wrap(function _callee3$(_context3) {
1595
+ while (1) {
1596
+ switch (_context3.prev = _context3.next) {
1597
+ case 0:
1598
+ _context3.prev = 0;
1599
+ client = new faunadb.Client({ secret: secret });
1600
+ _context3.next = 4;
1601
+ return client.query(q.Get(q.Match(q.Index('Email'), email)));
1602
+
1603
+ case 4:
1604
+ result = _context3.sent;
1605
+ hashedPassword = result.data.Password;
1606
+ _context3.next = 8;
1607
+ return comparePassword(password, hashedPassword);
1608
+
1609
+ case 8:
1610
+ isAuth = _context3.sent;
1611
+
1612
+ console.log(isAuth, password, hashedPassword);
1613
+ return _context3.abrupt('return', isAuth ? { email: email } : false);
1614
+
1615
+ case 13:
1616
+ _context3.prev = 13;
1617
+ _context3.t0 = _context3['catch'](0);
1618
+
1619
+ console.log(_context3.t0);
1620
+ return _context3.abrupt('return', false);
1621
+
1622
+ case 17:
1623
+ case 'end':
1624
+ return _context3.stop();
1625
+ }
1626
+ }
1627
+ }, _callee3, this, [[0, 13]]);
1628
+ }));
1629
+
1630
+ return function authenticateUser(_x3, _x4) {
1631
+ return _ref3.apply(this, arguments);
1632
+ };
1633
+ }();
1634
+
1635
+ exports.authenticateUser = authenticateUser;
1636
+ exports.findUserByEmail = findUserByEmail;
1637
+ exports.registerUser = registerUser;