├── .editorconfig ├── .gitignore ├── .nvmrc ├── LICENSE ├── crawler ├── .babelrc ├── .gcloudignore ├── duplicate_tags.json ├── ignored_tags.json ├── index.js ├── package-lock.json ├── package.json ├── pub_tags.json └── rules.js ├── imager ├── .gcloudignore ├── index.js ├── package-lock.json ├── package.json └── utils.js ├── webflow_forms ├── .gcloudignore ├── index.js ├── package-lock.json └── package.json └── webhook ├── .gcloudignore ├── index.js ├── package-lock.json ├── package.json └── utils.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | end_of_line = lf 10 | # editorconfig-tools is unable to ignore longs strings or urls 11 | max_line_length = null 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .env.yaml 3 | sources.csv 4 | 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | 12 | # Dependency directories 13 | node_modules/ 14 | 15 | # Optional npm cache directory 16 | .npm 17 | 18 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 10.15.3 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU AFFERO GENERAL PUBLIC LICENSE 2 | Version 3, 19 November 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU Affero General Public License is a free, copyleft license for 11 | software and other kinds of works, specifically designed to ensure 12 | cooperation with the community in the case of network server software. 13 | 14 | The licenses for most software and other practical works are designed 15 | to take away your freedom to share and change the works. By contrast, 16 | our General Public Licenses are intended to guarantee your freedom to 17 | share and change all versions of a program--to make sure it remains free 18 | software for all its users. 19 | 20 | When we speak of free software, we are referring to freedom, not 21 | price. Our General Public Licenses are designed to make sure that you 22 | have the freedom to distribute copies of free software (and charge for 23 | them if you wish), that you receive source code or can get it if you 24 | want it, that you can change the software or use pieces of it in new 25 | free programs, and that you know you can do these things. 26 | 27 | Developers that use our General Public Licenses protect your rights 28 | with two steps: (1) assert copyright on the software, and (2) offer 29 | you this License which gives you legal permission to copy, distribute 30 | and/or modify the software. 31 | 32 | A secondary benefit of defending all users' freedom is that 33 | improvements made in alternate versions of the program, if they 34 | receive widespread use, become available for other developers to 35 | incorporate. Many developers of free software are heartened and 36 | encouraged by the resulting cooperation. However, in the case of 37 | software used on network servers, this result may fail to come about. 38 | The GNU General Public License permits making a modified version and 39 | letting the public access it on a server without ever releasing its 40 | source code to the public. 41 | 42 | The GNU Affero General Public License is designed specifically to 43 | ensure that, in such cases, the modified source code becomes available 44 | to the community. It requires the operator of a network server to 45 | provide the source code of the modified version running there to the 46 | users of that server. Therefore, public use of a modified version, on 47 | a publicly accessible server, gives the public access to the source 48 | code of the modified version. 49 | 50 | An older license, called the Affero General Public License and 51 | published by Affero, was designed to accomplish similar goals. This is 52 | a different license, not a version of the Affero GPL, but Affero has 53 | released a new version of the Affero GPL which permits relicensing under 54 | this license. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | TERMS AND CONDITIONS 60 | 61 | 0. Definitions. 62 | 63 | "This License" refers to version 3 of the GNU Affero General Public License. 64 | 65 | "Copyright" also means copyright-like laws that apply to other kinds of 66 | works, such as semiconductor masks. 67 | 68 | "The Program" refers to any copyrightable work licensed under this 69 | License. Each licensee is addressed as "you". "Licensees" and 70 | "recipients" may be individuals or organizations. 71 | 72 | To "modify" a work means to copy from or adapt all or part of the work 73 | in a fashion requiring copyright permission, other than the making of an 74 | exact copy. The resulting work is called a "modified version" of the 75 | earlier work or a work "based on" the earlier work. 76 | 77 | A "covered work" means either the unmodified Program or a work based 78 | on the Program. 79 | 80 | To "propagate" a work means to do anything with it that, without 81 | permission, would make you directly or secondarily liable for 82 | infringement under applicable copyright law, except executing it on a 83 | computer or modifying a private copy. Propagation includes copying, 84 | distribution (with or without modification), making available to the 85 | public, and in some countries other activities as well. 86 | 87 | To "convey" a work means any kind of propagation that enables other 88 | parties to make or receive copies. Mere interaction with a user through 89 | a computer network, with no transfer of a copy, is not conveying. 90 | 91 | An interactive user interface displays "Appropriate Legal Notices" 92 | to the extent that it includes a convenient and prominently visible 93 | feature that (1) displays an appropriate copyright notice, and (2) 94 | tells the user that there is no warranty for the work (except to the 95 | extent that warranties are provided), that licensees may convey the 96 | work under this License, and how to view a copy of this License. If 97 | the interface presents a list of user commands or options, such as a 98 | menu, a prominent item in the list meets this criterion. 99 | 100 | 1. Source Code. 101 | 102 | The "source code" for a work means the preferred form of the work 103 | for making modifications to it. "Object code" means any non-source 104 | form of a work. 105 | 106 | A "Standard Interface" means an interface that either is an official 107 | standard defined by a recognized standards body, or, in the case of 108 | interfaces specified for a particular programming language, one that 109 | is widely used among developers working in that language. 110 | 111 | The "System Libraries" of an executable work include anything, other 112 | than the work as a whole, that (a) is included in the normal form of 113 | packaging a Major Component, but which is not part of that Major 114 | Component, and (b) serves only to enable use of the work with that 115 | Major Component, or to implement a Standard Interface for which an 116 | implementation is available to the public in source code form. A 117 | "Major Component", in this context, means a major essential component 118 | (kernel, window system, and so on) of the specific operating system 119 | (if any) on which the executable work runs, or a compiler used to 120 | produce the work, or an object code interpreter used to run it. 121 | 122 | The "Corresponding Source" for a work in object code form means all 123 | the source code needed to generate, install, and (for an executable 124 | work) run the object code and to modify the work, including scripts to 125 | control those activities. However, it does not include the work's 126 | System Libraries, or general-purpose tools or generally available free 127 | programs which are used unmodified in performing those activities but 128 | which are not part of the work. For example, Corresponding Source 129 | includes interface definition files associated with source files for 130 | the work, and the source code for shared libraries and dynamically 131 | linked subprograms that the work is specifically designed to require, 132 | such as by intimate data communication or control flow between those 133 | subprograms and other parts of the work. 134 | 135 | The Corresponding Source need not include anything that users 136 | can regenerate automatically from other parts of the Corresponding 137 | Source. 138 | 139 | The Corresponding Source for a work in source code form is that 140 | same work. 141 | 142 | 2. Basic Permissions. 143 | 144 | All rights granted under this License are granted for the term of 145 | copyright on the Program, and are irrevocable provided the stated 146 | conditions are met. This License explicitly affirms your unlimited 147 | permission to run the unmodified Program. The output from running a 148 | covered work is covered by this License only if the output, given its 149 | content, constitutes a covered work. This License acknowledges your 150 | rights of fair use or other equivalent, as provided by copyright law. 151 | 152 | You may make, run and propagate covered works that you do not 153 | convey, without conditions so long as your license otherwise remains 154 | in force. You may convey covered works to others for the sole purpose 155 | of having them make modifications exclusively for you, or provide you 156 | with facilities for running those works, provided that you comply with 157 | the terms of this License in conveying all material for which you do 158 | not control copyright. Those thus making or running the covered works 159 | for you must do so exclusively on your behalf, under your direction 160 | and control, on terms that prohibit them from making any copies of 161 | your copyrighted material outside their relationship with you. 162 | 163 | Conveying under any other circumstances is permitted solely under 164 | the conditions stated below. Sublicensing is not allowed; section 10 165 | makes it unnecessary. 166 | 167 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 168 | 169 | No covered work shall be deemed part of an effective technological 170 | measure under any applicable law fulfilling obligations under article 171 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 172 | similar laws prohibiting or restricting circumvention of such 173 | measures. 174 | 175 | When you convey a covered work, you waive any legal power to forbid 176 | circumvention of technological measures to the extent such circumvention 177 | is effected by exercising rights under this License with respect to 178 | the covered work, and you disclaim any intention to limit operation or 179 | modification of the work as a means of enforcing, against the work's 180 | users, your or third parties' legal rights to forbid circumvention of 181 | technological measures. 182 | 183 | 4. Conveying Verbatim Copies. 184 | 185 | You may convey verbatim copies of the Program's source code as you 186 | receive it, in any medium, provided that you conspicuously and 187 | appropriately publish on each copy an appropriate copyright notice; 188 | keep intact all notices stating that this License and any 189 | non-permissive terms added in accord with section 7 apply to the code; 190 | keep intact all notices of the absence of any warranty; and give all 191 | recipients a copy of this License along with the Program. 192 | 193 | You may charge any price or no price for each copy that you convey, 194 | and you may offer support or warranty protection for a fee. 195 | 196 | 5. Conveying Modified Source Versions. 197 | 198 | You may convey a work based on the Program, or the modifications to 199 | produce it from the Program, in the form of source code under the 200 | terms of section 4, provided that you also meet all of these conditions: 201 | 202 | a) The work must carry prominent notices stating that you modified 203 | it, and giving a relevant date. 204 | 205 | b) The work must carry prominent notices stating that it is 206 | released under this License and any conditions added under section 207 | 7. This requirement modifies the requirement in section 4 to 208 | "keep intact all notices". 209 | 210 | c) You must license the entire work, as a whole, under this 211 | License to anyone who comes into possession of a copy. This 212 | License will therefore apply, along with any applicable section 7 213 | additional terms, to the whole of the work, and all its parts, 214 | regardless of how they are packaged. This License gives no 215 | permission to license the work in any other way, but it does not 216 | invalidate such permission if you have separately received it. 217 | 218 | d) If the work has interactive user interfaces, each must display 219 | Appropriate Legal Notices; however, if the Program has interactive 220 | interfaces that do not display Appropriate Legal Notices, your 221 | work need not make them do so. 222 | 223 | A compilation of a covered work with other separate and independent 224 | works, which are not by their nature extensions of the covered work, 225 | and which are not combined with it such as to form a larger program, 226 | in or on a volume of a storage or distribution medium, is called an 227 | "aggregate" if the compilation and its resulting copyright are not 228 | used to limit the access or legal rights of the compilation's users 229 | beyond what the individual works permit. Inclusion of a covered work 230 | in an aggregate does not cause this License to apply to the other 231 | parts of the aggregate. 232 | 233 | 6. Conveying Non-Source Forms. 234 | 235 | You may convey a covered work in object code form under the terms 236 | of sections 4 and 5, provided that you also convey the 237 | machine-readable Corresponding Source under the terms of this License, 238 | in one of these ways: 239 | 240 | a) Convey the object code in, or embodied in, a physical product 241 | (including a physical distribution medium), accompanied by the 242 | Corresponding Source fixed on a durable physical medium 243 | customarily used for software interchange. 244 | 245 | b) Convey the object code in, or embodied in, a physical product 246 | (including a physical distribution medium), accompanied by a 247 | written offer, valid for at least three years and valid for as 248 | long as you offer spare parts or customer support for that product 249 | model, to give anyone who possesses the object code either (1) a 250 | copy of the Corresponding Source for all the software in the 251 | product that is covered by this License, on a durable physical 252 | medium customarily used for software interchange, for a price no 253 | more than your reasonable cost of physically performing this 254 | conveying of source, or (2) access to copy the 255 | Corresponding Source from a network server at no charge. 256 | 257 | c) Convey individual copies of the object code with a copy of the 258 | written offer to provide the Corresponding Source. This 259 | alternative is allowed only occasionally and noncommercially, and 260 | only if you received the object code with such an offer, in accord 261 | with subsection 6b. 262 | 263 | d) Convey the object code by offering access from a designated 264 | place (gratis or for a charge), and offer equivalent access to the 265 | Corresponding Source in the same way through the same place at no 266 | further charge. You need not require recipients to copy the 267 | Corresponding Source along with the object code. If the place to 268 | copy the object code is a network server, the Corresponding Source 269 | may be on a different server (operated by you or a third party) 270 | that supports equivalent copying facilities, provided you maintain 271 | clear directions next to the object code saying where to find the 272 | Corresponding Source. Regardless of what server hosts the 273 | Corresponding Source, you remain obligated to ensure that it is 274 | available for as long as needed to satisfy these requirements. 275 | 276 | e) Convey the object code using peer-to-peer transmission, provided 277 | you inform other peers where the object code and Corresponding 278 | Source of the work are being offered to the general public at no 279 | charge under subsection 6d. 280 | 281 | A separable portion of the object code, whose source code is excluded 282 | from the Corresponding Source as a System Library, need not be 283 | included in conveying the object code work. 284 | 285 | A "User Product" is either (1) a "consumer product", which means any 286 | tangible personal property which is normally used for personal, family, 287 | or household purposes, or (2) anything designed or sold for incorporation 288 | into a dwelling. In determining whether a product is a consumer product, 289 | doubtful cases shall be resolved in favor of coverage. For a particular 290 | product received by a particular user, "normally used" refers to a 291 | typical or common use of that class of product, regardless of the status 292 | of the particular user or of the way in which the particular user 293 | actually uses, or expects or is expected to use, the product. A product 294 | is a consumer product regardless of whether the product has substantial 295 | commercial, industrial or non-consumer uses, unless such uses represent 296 | the only significant mode of use of the product. 297 | 298 | "Installation Information" for a User Product means any methods, 299 | procedures, authorization keys, or other information required to install 300 | and execute modified versions of a covered work in that User Product from 301 | a modified version of its Corresponding Source. The information must 302 | suffice to ensure that the continued functioning of the modified object 303 | code is in no case prevented or interfered with solely because 304 | modification has been made. 305 | 306 | If you convey an object code work under this section in, or with, or 307 | specifically for use in, a User Product, and the conveying occurs as 308 | part of a transaction in which the right of possession and use of the 309 | User Product is transferred to the recipient in perpetuity or for a 310 | fixed term (regardless of how the transaction is characterized), the 311 | Corresponding Source conveyed under this section must be accompanied 312 | by the Installation Information. But this requirement does not apply 313 | if neither you nor any third party retains the ability to install 314 | modified object code on the User Product (for example, the work has 315 | been installed in ROM). 316 | 317 | The requirement to provide Installation Information does not include a 318 | requirement to continue to provide support service, warranty, or updates 319 | for a work that has been modified or installed by the recipient, or for 320 | the User Product in which it has been modified or installed. Access to a 321 | network may be denied when the modification itself materially and 322 | adversely affects the operation of the network or violates the rules and 323 | protocols for communication across the network. 324 | 325 | Corresponding Source conveyed, and Installation Information provided, 326 | in accord with this section must be in a format that is publicly 327 | documented (and with an implementation available to the public in 328 | source code form), and must require no special password or key for 329 | unpacking, reading or copying. 330 | 331 | 7. Additional Terms. 332 | 333 | "Additional permissions" are terms that supplement the terms of this 334 | License by making exceptions from one or more of its conditions. 335 | Additional permissions that are applicable to the entire Program shall 336 | be treated as though they were included in this License, to the extent 337 | that they are valid under applicable law. If additional permissions 338 | apply only to part of the Program, that part may be used separately 339 | under those permissions, but the entire Program remains governed by 340 | this License without regard to the additional permissions. 341 | 342 | When you convey a copy of a covered work, you may at your option 343 | remove any additional permissions from that copy, or from any part of 344 | it. (Additional permissions may be written to require their own 345 | removal in certain cases when you modify the work.) You may place 346 | additional permissions on material, added by you to a covered work, 347 | for which you have or can give appropriate copyright permission. 348 | 349 | Notwithstanding any other provision of this License, for material you 350 | add to a covered work, you may (if authorized by the copyright holders of 351 | that material) supplement the terms of this License with terms: 352 | 353 | a) Disclaiming warranty or limiting liability differently from the 354 | terms of sections 15 and 16 of this License; or 355 | 356 | b) Requiring preservation of specified reasonable legal notices or 357 | author attributions in that material or in the Appropriate Legal 358 | Notices displayed by works containing it; or 359 | 360 | c) Prohibiting misrepresentation of the origin of that material, or 361 | requiring that modified versions of such material be marked in 362 | reasonable ways as different from the original version; or 363 | 364 | d) Limiting the use for publicity purposes of names of licensors or 365 | authors of the material; or 366 | 367 | e) Declining to grant rights under trademark law for use of some 368 | trade names, trademarks, or service marks; or 369 | 370 | f) Requiring indemnification of licensors and authors of that 371 | material by anyone who conveys the material (or modified versions of 372 | it) with contractual assumptions of liability to the recipient, for 373 | any liability that these contractual assumptions directly impose on 374 | those licensors and authors. 375 | 376 | All other non-permissive additional terms are considered "further 377 | restrictions" within the meaning of section 10. If the Program as you 378 | received it, or any part of it, contains a notice stating that it is 379 | governed by this License along with a term that is a further 380 | restriction, you may remove that term. If a license document contains 381 | a further restriction but permits relicensing or conveying under this 382 | License, you may add to a covered work material governed by the terms 383 | of that license document, provided that the further restriction does 384 | not survive such relicensing or conveying. 385 | 386 | If you add terms to a covered work in accord with this section, you 387 | must place, in the relevant source files, a statement of the 388 | additional terms that apply to those files, or a notice indicating 389 | where to find the applicable terms. 390 | 391 | Additional terms, permissive or non-permissive, may be stated in the 392 | form of a separately written license, or stated as exceptions; 393 | the above requirements apply either way. 394 | 395 | 8. Termination. 396 | 397 | You may not propagate or modify a covered work except as expressly 398 | provided under this License. Any attempt otherwise to propagate or 399 | modify it is void, and will automatically terminate your rights under 400 | this License (including any patent licenses granted under the third 401 | paragraph of section 11). 402 | 403 | However, if you cease all violation of this License, then your 404 | license from a particular copyright holder is reinstated (a) 405 | provisionally, unless and until the copyright holder explicitly and 406 | finally terminates your license, and (b) permanently, if the copyright 407 | holder fails to notify you of the violation by some reasonable means 408 | prior to 60 days after the cessation. 409 | 410 | Moreover, your license from a particular copyright holder is 411 | reinstated permanently if the copyright holder notifies you of the 412 | violation by some reasonable means, this is the first time you have 413 | received notice of violation of this License (for any work) from that 414 | copyright holder, and you cure the violation prior to 30 days after 415 | your receipt of the notice. 416 | 417 | Termination of your rights under this section does not terminate the 418 | licenses of parties who have received copies or rights from you under 419 | this License. If your rights have been terminated and not permanently 420 | reinstated, you do not qualify to receive new licenses for the same 421 | material under section 10. 422 | 423 | 9. Acceptance Not Required for Having Copies. 424 | 425 | You are not required to accept this License in order to receive or 426 | run a copy of the Program. Ancillary propagation of a covered work 427 | occurring solely as a consequence of using peer-to-peer transmission 428 | to receive a copy likewise does not require acceptance. However, 429 | nothing other than this License grants you permission to propagate or 430 | modify any covered work. These actions infringe copyright if you do 431 | not accept this License. Therefore, by modifying or propagating a 432 | covered work, you indicate your acceptance of this License to do so. 433 | 434 | 10. Automatic Licensing of Downstream Recipients. 435 | 436 | Each time you convey a covered work, the recipient automatically 437 | receives a license from the original licensors, to run, modify and 438 | propagate that work, subject to this License. You are not responsible 439 | for enforcing compliance by third parties with this License. 440 | 441 | An "entity transaction" is a transaction transferring control of an 442 | organization, or substantially all assets of one, or subdividing an 443 | organization, or merging organizations. If propagation of a covered 444 | work results from an entity transaction, each party to that 445 | transaction who receives a copy of the work also receives whatever 446 | licenses to the work the party's predecessor in interest had or could 447 | give under the previous paragraph, plus a right to possession of the 448 | Corresponding Source of the work from the predecessor in interest, if 449 | the predecessor has it or can get it with reasonable efforts. 450 | 451 | You may not impose any further restrictions on the exercise of the 452 | rights granted or affirmed under this License. For example, you may 453 | not impose a license fee, royalty, or other charge for exercise of 454 | rights granted under this License, and you may not initiate litigation 455 | (including a cross-claim or counterclaim in a lawsuit) alleging that 456 | any patent claim is infringed by making, using, selling, offering for 457 | sale, or importing the Program or any portion of it. 458 | 459 | 11. Patents. 460 | 461 | A "contributor" is a copyright holder who authorizes use under this 462 | License of the Program or a work on which the Program is based. The 463 | work thus licensed is called the contributor's "contributor version". 464 | 465 | A contributor's "essential patent claims" are all patent claims 466 | owned or controlled by the contributor, whether already acquired or 467 | hereafter acquired, that would be infringed by some manner, permitted 468 | by this License, of making, using, or selling its contributor version, 469 | but do not include claims that would be infringed only as a 470 | consequence of further modification of the contributor version. For 471 | purposes of this definition, "control" includes the right to grant 472 | patent sublicenses in a manner consistent with the requirements of 473 | this License. 474 | 475 | Each contributor grants you a non-exclusive, worldwide, royalty-free 476 | patent license under the contributor's essential patent claims, to 477 | make, use, sell, offer for sale, import and otherwise run, modify and 478 | propagate the contents of its contributor version. 479 | 480 | In the following three paragraphs, a "patent license" is any express 481 | agreement or commitment, however denominated, not to enforce a patent 482 | (such as an express permission to practice a patent or covenant not to 483 | sue for patent infringement). To "grant" such a patent license to a 484 | party means to make such an agreement or commitment not to enforce a 485 | patent against the party. 486 | 487 | If you convey a covered work, knowingly relying on a patent license, 488 | and the Corresponding Source of the work is not available for anyone 489 | to copy, free of charge and under the terms of this License, through a 490 | publicly available network server or other readily accessible means, 491 | then you must either (1) cause the Corresponding Source to be so 492 | available, or (2) arrange to deprive yourself of the benefit of the 493 | patent license for this particular work, or (3) arrange, in a manner 494 | consistent with the requirements of this License, to extend the patent 495 | license to downstream recipients. "Knowingly relying" means you have 496 | actual knowledge that, but for the patent license, your conveying the 497 | covered work in a country, or your recipient's use of the covered work 498 | in a country, would infringe one or more identifiable patents in that 499 | country that you have reason to believe are valid. 500 | 501 | If, pursuant to or in connection with a single transaction or 502 | arrangement, you convey, or propagate by procuring conveyance of, a 503 | covered work, and grant a patent license to some of the parties 504 | receiving the covered work authorizing them to use, propagate, modify 505 | or convey a specific copy of the covered work, then the patent license 506 | you grant is automatically extended to all recipients of the covered 507 | work and works based on it. 508 | 509 | A patent license is "discriminatory" if it does not include within 510 | the scope of its coverage, prohibits the exercise of, or is 511 | conditioned on the non-exercise of one or more of the rights that are 512 | specifically granted under this License. You may not convey a covered 513 | work if you are a party to an arrangement with a third party that is 514 | in the business of distributing software, under which you make payment 515 | to the third party based on the extent of your activity of conveying 516 | the work, and under which the third party grants, to any of the 517 | parties who would receive the covered work from you, a discriminatory 518 | patent license (a) in connection with copies of the covered work 519 | conveyed by you (or copies made from those copies), or (b) primarily 520 | for and in connection with specific products or compilations that 521 | contain the covered work, unless you entered into that arrangement, 522 | or that patent license was granted, prior to 28 March 2007. 523 | 524 | Nothing in this License shall be construed as excluding or limiting 525 | any implied license or other defenses to infringement that may 526 | otherwise be available to you under applicable patent law. 527 | 528 | 12. No Surrender of Others' Freedom. 529 | 530 | If conditions are imposed on you (whether by court order, agreement or 531 | otherwise) that contradict the conditions of this License, they do not 532 | excuse you from the conditions of this License. If you cannot convey a 533 | covered work so as to satisfy simultaneously your obligations under this 534 | License and any other pertinent obligations, then as a consequence you may 535 | not convey it at all. For example, if you agree to terms that obligate you 536 | to collect a royalty for further conveying from those to whom you convey 537 | the Program, the only way you could satisfy both those terms and this 538 | License would be to refrain entirely from conveying the Program. 539 | 540 | 13. Remote Network Interaction; Use with the GNU General Public License. 541 | 542 | Notwithstanding any other provision of this License, if you modify the 543 | Program, your modified version must prominently offer all users 544 | interacting with it remotely through a computer network (if your version 545 | supports such interaction) an opportunity to receive the Corresponding 546 | Source of your version by providing access to the Corresponding Source 547 | from a network server at no charge, through some standard or customary 548 | means of facilitating copying of software. This Corresponding Source 549 | shall include the Corresponding Source for any work covered by version 3 550 | of the GNU General Public License that is incorporated pursuant to the 551 | following paragraph. 552 | 553 | Notwithstanding any other provision of this License, you have 554 | permission to link or combine any covered work with a work licensed 555 | under version 3 of the GNU General Public License into a single 556 | combined work, and to convey the resulting work. The terms of this 557 | License will continue to apply to the part which is the covered work, 558 | but the work with which it is combined will remain governed by version 559 | 3 of the GNU General Public License. 560 | 561 | 14. Revised Versions of this License. 562 | 563 | The Free Software Foundation may publish revised and/or new versions of 564 | the GNU Affero General Public License from time to time. Such new versions 565 | will be similar in spirit to the present version, but may differ in detail to 566 | address new problems or concerns. 567 | 568 | Each version is given a distinguishing version number. If the 569 | Program specifies that a certain numbered version of the GNU Affero General 570 | Public License "or any later version" applies to it, you have the 571 | option of following the terms and conditions either of that numbered 572 | version or of any later version published by the Free Software 573 | Foundation. If the Program does not specify a version number of the 574 | GNU Affero General Public License, you may choose any version ever published 575 | by the Free Software Foundation. 576 | 577 | If the Program specifies that a proxy can decide which future 578 | versions of the GNU Affero General Public License can be used, that proxy's 579 | public statement of acceptance of a version permanently authorizes you 580 | to choose that version for the Program. 581 | 582 | Later license versions may give you additional or different 583 | permissions. However, no additional obligations are imposed on any 584 | author or copyright holder as a result of your choosing to follow a 585 | later version. 586 | 587 | 15. Disclaimer of Warranty. 588 | 589 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 590 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 591 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 592 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 593 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 594 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 595 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 596 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 597 | 598 | 16. Limitation of Liability. 599 | 600 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 601 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 602 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 603 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 604 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 605 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 606 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 607 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 608 | SUCH DAMAGES. 609 | 610 | 17. Interpretation of Sections 15 and 16. 611 | 612 | If the disclaimer of warranty and limitation of liability provided 613 | above cannot be given local legal effect according to their terms, 614 | reviewing courts shall apply local law that most closely approximates 615 | an absolute waiver of all civil liability in connection with the 616 | Program, unless a warranty or assumption of liability accompanies a 617 | copy of the Program in return for a fee. 618 | 619 | END OF TERMS AND CONDITIONS 620 | 621 | How to Apply These Terms to Your New Programs 622 | 623 | If you develop a new program, and you want it to be of the greatest 624 | possible use to the public, the best way to achieve this is to make it 625 | free software which everyone can redistribute and change under these terms. 626 | 627 | To do so, attach the following notices to the program. It is safest 628 | to attach them to the start of each source file to most effectively 629 | state the exclusion of warranty; and each file should have at least 630 | the "copyright" line and a pointer to where the full notice is found. 631 | 632 | 633 | Copyright (C) 634 | 635 | This program is free software: you can redistribute it and/or modify 636 | it under the terms of the GNU Affero General Public License as published 637 | by the Free Software Foundation, either version 3 of the License, or 638 | (at your option) any later version. 639 | 640 | This program is distributed in the hope that it will be useful, 641 | but WITHOUT ANY WARRANTY; without even the implied warranty of 642 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 643 | GNU Affero General Public License for more details. 644 | 645 | You should have received a copy of the GNU Affero General Public License 646 | along with this program. If not, see . 647 | 648 | Also add information on how to contact you by electronic and paper mail. 649 | 650 | If your software can interact with users remotely through a computer 651 | network, you should also make sure that it provides a way for users to 652 | get its source. For example, if your program is a web application, its 653 | interface could display a "Source" link that leads users to an archive 654 | of the code. There are many ways you could offer source, and different 655 | solutions will be better for different programs; see section 13 for the 656 | specific requirements. 657 | 658 | You should also get your employer (if you work as a programmer) or school, 659 | if any, to sign a "copyright disclaimer" for the program, if necessary. 660 | For more information on this, and how to apply and follow the GNU AGPL, see 661 | . 662 | -------------------------------------------------------------------------------- /crawler/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "env", 5 | { 6 | "targets": { 7 | "node": "6.14" 8 | } 9 | } 10 | ] 11 | ], 12 | "plugins": [ 13 | "transform-object-rest-spread" 14 | ] 15 | } -------------------------------------------------------------------------------- /crawler/.gcloudignore: -------------------------------------------------------------------------------- 1 | # This file specifies files that are *not* uploaded to Google Cloud Platform 2 | # using gcloud. It follows the same syntax as .gitignore, with the addition of 3 | # "#!include" directives (which insert the entries of the given .gitignore-style 4 | # file at that point). 5 | # 6 | # For more information, run: 7 | # $ gcloud topic gcloudignore 8 | # 9 | .gcloudignore 10 | # If you would like to upload your .git directory, .gitignore file or files 11 | # from your .gitignore file, remove the corresponding line 12 | # below: 13 | .git 14 | .gitignore 15 | -------------------------------------------------------------------------------- /crawler/duplicate_tags.json: -------------------------------------------------------------------------------- 1 | { 2 | "web-development": "webdev", 3 | "web-dev": "webdev", 4 | "front-end-development": "frontend", 5 | "frontend-development": "frontend", 6 | "software-development": "development", 7 | "app-development": "development", 8 | "programming": "development", 9 | "coding": "development", 10 | "developer": "development", 11 | "engineering": "development", 12 | "software-engineering": "development", 13 | "vuejs": "vue", 14 | "vue.js": "vue", 15 | "reactjs": "react", 16 | "technology": "tech", 17 | "artificial-intelligence": "ai", 18 | "go": "golang", 19 | "careers": "career", 20 | "cloud-computing": "cloud", 21 | "culture-&-methods": "culture", 22 | "data-scientist": "data-science", 23 | "life-lessons": "life", 24 | "mobile-app-development": "mobile", 25 | "node": "nodejs", 26 | "node.js": "nodejs", 27 | "personal-growth": "personal-development", 28 | "self-improvement": "personal-development", 29 | "self": "personal-development", 30 | "startup": "startups", 31 | "general-programming": "development", 32 | ".net": "dotnet" 33 | } 34 | -------------------------------------------------------------------------------- /crawler/ignored_tags.json: -------------------------------------------------------------------------------- 1 | ["uncategorized", "architecture-&-design", "towards-data-science", "ai,-ml-&-data-engineering", "article", "tc", "blogging", "2articles1week"] 2 | -------------------------------------------------------------------------------- /crawler/index.js: -------------------------------------------------------------------------------- 1 | const got = require('got'); 2 | const langDetector = new (require('languagedetect')); 3 | const metascraper = require('metascraper').load([ 4 | require('metascraper-date')(), 5 | require('metascraper-url')(), 6 | require('./rules')(), 7 | ]); 8 | const { PubSub } = require(`@google-cloud/pubsub`); 9 | const pubsub = new PubSub(); 10 | const duplicateTags = require('./duplicate_tags'); 11 | const ignoredTags = require('./ignored_tags'); 12 | const pubTags = require('./pub_tags'); 13 | const topic = pubsub.topic('crawled-post'); 14 | 15 | const specificMetaFixes = (pubId, url, meta) => { 16 | switch (pubId) { 17 | case 'addy': 18 | // Addy Osmani blog has wrong twitter:url tag 19 | return Object.assign({}, meta, { url }); 20 | case 'bair': 21 | // BAIR has wrong image url in the meta tags 22 | return Object.assign({}, meta, { image: meta.image.replace('blogassets', 'blog/assets') }); 23 | default: 24 | return meta; 25 | } 26 | }; 27 | 28 | const formatMeta = (meta) => 29 | Object.assign({}, meta, { 30 | readTime: meta.readTime ? meta.readTime.duration : null, 31 | paid: meta.paid === 'true', 32 | isMediumComment: meta.isMediumComment === 'true', 33 | }); 34 | 35 | const extractMetaTags = (pubId, url) => 36 | got(url) 37 | .then(({ body: html, url }) => metascraper({ html, url })) 38 | .then(res => specificMetaFixes(pubId, url, formatMeta(res))); 39 | 40 | const convertTagsToSchema = (tags) => { 41 | const obj = Object.assign({}, tags); 42 | if (obj.date) { 43 | obj.publishedAt = new Date(obj.date); 44 | } 45 | delete obj.date; 46 | if (obj.modified) { 47 | obj.updatedAt = new Date(obj.modified); 48 | } 49 | delete obj.modified; 50 | if (obj.keywords) { 51 | obj.tags = obj.keywords; 52 | } 53 | delete obj.keywords; 54 | return obj; 55 | }; 56 | 57 | const getIfTrue = (cond, key, value) => cond ? { [key]: value } : {}; 58 | 59 | const processTags = (data) => { 60 | let tags = data.tags || []; 61 | if (data.tags && data.tags.length) { 62 | tags = data.tags.map(t => { 63 | const newT = t.toLowerCase().split('&')[0].trim().replace(/ /g, '-'); 64 | if (duplicateTags[newT]) { 65 | return duplicateTags[newT]; 66 | } 67 | return newT; 68 | }).filter(t => t.length > 0 && ignoredTags.indexOf(t) < 0); 69 | } 70 | if (pubTags[data.publicationId]) { 71 | tags = tags.concat(pubTags[data.publicationId]); 72 | } 73 | tags = Array.from(new Set(tags)); 74 | return Object.assign({}, data, { tags }); 75 | }; 76 | 77 | function isEnglish(text) { 78 | const langs = langDetector.detect(text, 10); 79 | return !!langs.find(l => l[0] === 'english'); 80 | } 81 | 82 | exports.crawler = (event) => { 83 | const data = JSON.parse(Buffer.from(event.data, 'base64').toString()); 84 | // Get rid of source=rss* added by Medium 85 | data.url = data.url.replace(/\?source=rss(.*)/, ''); 86 | 87 | console.log(`[${data.id}] scraping ${data.url} to enrich`, data); 88 | 89 | return extractMetaTags(data.publicationId, data.url) 90 | .then(convertTagsToSchema) 91 | .then(tags => Object.assign({}, data, tags, getIfTrue(data.title && data.title.length < 255, 'title', data.title), getIfTrue(data.tags && data.tags.length > 0, 'tags', data.tags))) 92 | .catch((err) => { 93 | if (err.statusCode === 404) { 94 | console.info(`[${data.id}] post doesn't exist anymore ${data.url}`); 95 | return null; 96 | } 97 | 98 | console.warn(`[${data.id}] failed to scrape ${data.url}`, err); 99 | return data; 100 | }) 101 | .then(processTags) 102 | .then((item) => { 103 | if (!item) { 104 | return Promise.resolve(); 105 | } 106 | 107 | if (item.paid) { 108 | console.log(`[${data.id}] paid content is ignored`, item); 109 | return Promise.resolve(); 110 | } 111 | 112 | if (item.isMediumComment && item.url.indexOf('medium.com') >= 0) { 113 | console.log(`[${data.id}] medium comment is ignored`, item); 114 | return Promise.resolve(); 115 | } 116 | 117 | // if (!isEnglish(item.title)) { 118 | // console.log(`[${data.id}] non-english content is ignored`, item); 119 | // return Promise.resolve(); 120 | // } 121 | 122 | if (item.tags && item.tags.indexOf('sponsored') > -1) { 123 | console.log(`[${data.id}] sponsored content is ignored`, item); 124 | return Promise.resolve(); 125 | } 126 | 127 | console.log(`[${data.id}] crawled post`, item); 128 | return topic.publish(Buffer.from(JSON.stringify(item))); 129 | }); 130 | }; 131 | 132 | // const publicationId = 'dc'; 133 | // extractMetaTags(publicationId, 'https://firebase.googleblog.com/2020/03/firebase-kotlin-ga.html') 134 | // .then(convertTagsToSchema) 135 | // .then(data => processTags({ ...data, publicationId })) 136 | // .then(console.log) 137 | // .catch(console.error); 138 | -------------------------------------------------------------------------------- /crawler/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daily-crawler", 3 | "main": "index.js", 4 | "private": true, 5 | "scripts": { 6 | "deploy": "gcloud --project devkit-prod beta functions deploy crawler --runtime nodejs10 --trigger-resource post-fetched --trigger-event google.pubsub.topic.publish" 7 | }, 8 | "engines": { 9 | "node": "~10.15.0" 10 | }, 11 | "dependencies": { 12 | "@google-cloud/pubsub": "^2.7.0", 13 | "got": "^9.6.0", 14 | "languagedetect": "^2.0.0", 15 | "metascraper": "^3.12.1", 16 | "metascraper-date": "^3.11.4", 17 | "metascraper-title": "^3.12.1", 18 | "metascraper-url": "^3.12.1", 19 | "read-time-estimate": "0.0.2" 20 | }, 21 | "devDependencies": { 22 | "babel-cli": "^6.26.0", 23 | "babel-plugin-transform-object-rest-spread": "^6.26.0", 24 | "babel-preset-env": "^1.7.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /crawler/pub_tags.json: -------------------------------------------------------------------------------- 1 | { 2 | "addy": ["webdev"], 3 | "andwkly": ["android"], 4 | "appledev": ["apple"], 5 | "appsignal": ["development"], 6 | "apollo": ["webdev", "backend", "graphql"], 7 | "ardlbs": ["golang"], 8 | "aurelia": ["webdev", "frontend"], 9 | "auth0": ["development"], 10 | "awego": ["golang"], 11 | "aweios": ["apple", "ios"], 12 | "awelix": ["elixir"], 13 | "bair": ["machine-learning", "ai", "deep-learning"], 14 | "bitbar": ["testing", "development"], 15 | "circle": ["devops", "testing"], 16 | "cleancoder": ["development"], 17 | "clper": ["azure", "sql-server", "microsoft"], 18 | "codepen": ["showdev", "frontend", "webdev"], 19 | "cpplib": ["c++"], 20 | "csswe": ["webdev", "frontend"], 21 | "css_tricks": ["webdev", "frontend"], 22 | "devops": ["devops"], 23 | "devopschat": ["devops"], 24 | "dbwkly": ["database", "devops"], 25 | "django": ["webdev", "python"], 26 | "distill": ["machine-learning", "ai"], 27 | "ds_central": ["data-science"], 28 | "elastic": ["devops", "elastic"], 29 | "electron": ["nodejs", "electron"], 30 | "evrdyrails": ["ruby", "rails"], 31 | "ffocus": ["webdev", "frontend"], 32 | "freecodecamp": ["webdev", "development"], 33 | "frontwkly": ["webdev", "frontend"], 34 | "gatsby": ["gatsby", "react", "frontend", "webdev"], 35 | "glitch": ["development"], 36 | "glw": ["golang"], 37 | "gqledit": ["webdev"], 38 | "golang": ["golang"], 39 | "guild": ["graphql"], 40 | "hackernoon": ["development"], 41 | "hc": ["devops"], 42 | "increment": ["webdev"], 43 | "inter": ["c++", "linux", "embedded"], 44 | "javaworld": ["java"], 45 | "jest": ["webdev", "javascript", "testing"], 46 | "jswkly": ["javascript", "webdev"], 47 | "k8s": ["kubernetes", "devops"], 48 | "kentcdodds": ["webdev", "javascript"], 49 | "keycdn": ["development", "webdev"], 50 | "kotlinwkly": ["kotlin"], 51 | "learnk8s": ["kubernetes", "devops"], 52 | "mafo": ["development"], 53 | "mmhaskell": ["haskell"], 54 | "mongomemo": ["devops", "mongo"], 55 | "ndwkly": ["nodejs", "webdev"], 56 | "next": ["react", "webdev", "ssr", "nextjs"], 57 | "nodejs": ["nodejs"], 58 | "nodesource": ["nodejs"], 59 | "ns": ["nativescript", "webdev"], 60 | "oai": ["ai", "data-science"], 61 | "objc": ["swift", "apple"], 62 | "okta": ["development"], 63 | "oss": ["open-source"], 64 | "overreacted": ["webdev", "development"], 65 | "pgdash": ["devops", "postgres"], 66 | "phplib": ["php"], 67 | "pycircle": ["python"], 68 | "react": ["react", "webdev"], 69 | "rbywkly": ["ruby"], 70 | "react_native": ["react", "frontend"], 71 | "reactstatus": ["react"], 72 | "rhdev": ["devops", "backend"], 73 | "riot": ["gaming"], 74 | "rpython": ["python"], 75 | "rust": ["rust"], 76 | "rustlib": ["rust"], 77 | "scotch": ["development", "webdev"], 78 | "servlsst": ["serverless", "devops", "cloud"], 79 | "shopify": ["development"], 80 | "snipcart": ["development"], 81 | "svelte": ["svelte", "webdev"], 82 | "symfony": ["symfony", "php"], 83 | "tidyv": ["data-science"], 84 | "tripleb": ["development"], 85 | "thn": ["security"], 86 | "tss": ["devops", "java"], 87 | "twirust": ["rust"], 88 | "unreal": ["gaming"], 89 | "v8": ["javascript", "webdev"], 90 | "vsmdev": ["microsoft", "dotnet"], 91 | "web": ["webdev"], 92 | "ember": ["ember", "webdev", "frontend", "javascript"], 93 | "17ba5ebf5aae4296b4c2c4d5bf3c2778": ["design"], 94 | "34bbbd06dc2d4cb48fbaa0812fc4ed18": ["design"], 95 | "40f4a18f3bb54009a7337acc75b6fb1a": ["news"], 96 | "b0e984941a15462db88d582f1442bf84": ["devops", "development"], 97 | "153719a0a4b146dca15f76b23a6fcce0": ["webdev", "wordpress", "development"], 98 | "13be5f7eb4ae48be9c6ec5634b51c601": ["design"], 99 | "08f78e0766694c9386033e45b6736dcb": ["vc", "entrepreneurship"], 100 | "6e6b4103c8d747bbb4cac4c609af00b7": ["webdev", "jamstack"], 101 | "ed85f74c369a46dea617bca10ee00e57": ["webdev", "ruby"], 102 | "d090fdeb381f4aaea3cc97a0964afc5f": ["vc", "entrepreneurship"], 103 | "358fa3d3b9d343f3a0b1151bf1e5fc34": ["product"], 104 | "497c0315013a4095b2c48b3a0f67deb1": ["healthcare"], 105 | "aae9820a1a3b4d4dac05f3c773b5f664": ["vc", "entrepreneurship"], 106 | "0622053dd77e4f83a2ee573b9a22bbea": ["design"], 107 | "3849974cc92a47da94fadac234b53f07": ["development"], 108 | "f4ecfc3c2b3c48e8815e76405d860001": ["news"], 109 | "827cd5eaaad94ff6a86239f8e71becd5": ["webdev", "javascript"], 110 | "92de1dd366984c3eb1a3c8563f73f0e1": ["javascript"], 111 | "a985140b369044a3819959087e3b4416": ["webdev", "frontend", "design"], 112 | "9d6de00f378642489a8bc73ad3101e06": ["webdev"], 113 | "a95ed97f1a554679bd2c73414559bb1b": ["news"], 114 | "d3532e9ea8694137af3c71029d1f1813": ["webdev"], 115 | "f467ae1b21794a679b5b6d8aaa7254fe": ["vc", "entrepreneurship"], 116 | "80b54d32e500499aa20ac00c0f27fdc7": ["devops", "aws", "cloud"], 117 | "598545f3f7e2414290b1517a20cfe2e5": ["news"], 118 | "62b9c60b981c4402abff164de38a2b74": ["news"], 119 | "011de8937473448394e0288107726bc8": ["science"], 120 | "16ad44f2c21f499ea2c907872e420e5c": ["science"], 121 | "3875bda3f9d54186938a9a37a4ef9667": ["science"], 122 | "9d4f3c387b5243a9b54c93fd9723e63d": ["science"], 123 | "dfb3c52e6ef64b96a67a040c1074d1c1": ["javascript"], 124 | "68d6a3239391457d9f310becf5fe49b1": ["javascript"], 125 | "9c723e49339f40f08cec8a7d70c4165a": ["science"], 126 | "ded4cfa6c7214b9f9f46526246a983b5": ["vc", "entrepreneurship"], 127 | "19c2d680c2e04d08a7ee4f2d9a876e03": ["golang"], 128 | "f5dbfb6c185043bcb280d3b8f1835d32": ["development"] 129 | } 130 | -------------------------------------------------------------------------------- /crawler/rules.js: -------------------------------------------------------------------------------- 1 | const { getUrl, isUrl } = require('@metascraper/helpers'); 2 | const { title: titleRules } = require('metascraper-title')(); 3 | const { validator: wrapTitle } = require('metascraper-title'); 4 | const readTimeEstimate = require('read-time-estimate'); 5 | 6 | const validatorTime = value => { 7 | if (!value) return false; 8 | return value.trim(); 9 | }; 10 | 11 | const wrapTime = rule => ({ htmlDom }) => { 12 | const value = rule(htmlDom); 13 | return validatorTime(value); 14 | }; 15 | 16 | const validatorUrl = (value, url) => isUrl(value) && getUrl(url, value); 17 | 18 | const wrapUrl = rule => ({ htmlDom, url }) => { 19 | const value = rule(htmlDom); 20 | return validatorUrl(value, url); 21 | }; 22 | 23 | const validatorTwitterHandle = value => { 24 | if (!value || value[0] !== '@') return false; 25 | return value; 26 | }; 27 | 28 | const wrapTwitterHandle = rule => ({ htmlDom }) => { 29 | const value = rule(htmlDom); 30 | return validatorTwitterHandle(value); 31 | }; 32 | 33 | const validatorTags = values => values.map(v => v.toLowerCase().trim()); 34 | 35 | const validatorKeywords = value => { 36 | if (!value || value.indexOf(',') < 0) return false; 37 | return validatorTags(value.split(',')); 38 | }; 39 | 40 | const wrapDevToTags = rule => ({ htmlDom }) => { 41 | const values = rule(htmlDom).map(t => t.replace('#', '')); 42 | if (!values || !values.length) return false; 43 | return validatorTags(values); 44 | }; 45 | 46 | const wrapElementTextTags = rule => ({ htmlDom }) => { 47 | const values = rule(htmlDom); 48 | if (!values || !values.length) return false; 49 | return validatorTags(values); 50 | }; 51 | 52 | const wrapMediumTags = rule => ({ htmlDom }) => { 53 | try { 54 | const script = rule(htmlDom); 55 | const json = JSON.parse(script); 56 | if (!json || !json.keywords || !json.keywords.filter) return false; 57 | return validatorTags(json.keywords.filter(t => t.indexOf('Tag:') > -1).map(t => t.replace('Tag:', ''))); 58 | } catch (ex) { 59 | return false; 60 | } 61 | }; 62 | 63 | const wrapProductHuntTags = rule => ({ htmlDom }) => { 64 | try { 65 | const script = rule(htmlDom); 66 | const json = JSON.parse(script); 67 | if (!json || !json.length || !json[0].applicationCategory || !json[0].applicationCategory.length) return false; 68 | return validatorTags(json[0].applicationCategory); 69 | } catch (ex) { 70 | return false; 71 | } 72 | }; 73 | 74 | const wrapKeywords = rule => ({ htmlDom }) => { 75 | const value = rule(htmlDom); 76 | return validatorKeywords(value); 77 | }; 78 | 79 | const wrapReadTime = rule => ({ htmlDom }) => { 80 | const element = rule(htmlDom); 81 | if (element) { 82 | return readTimeEstimate.default(element); 83 | } 84 | return false; 85 | }; 86 | 87 | const testForStar = el => 88 | el.attr('class') && el.attr('class').indexOf('star') > -1 && el.attr('class').indexOf('svgIcon') > -1; 89 | 90 | const wrapMediumPaywall = rule => ({ htmlDom }) => { 91 | const elements = rule(htmlDom); 92 | const star = elements.filter(el => (testForStar(el) || testForStar(el.parent()))); 93 | // Workaround as you must return string, otherwise value is ignored 94 | return star.length > 0 ? 'true' : false; 95 | }; 96 | 97 | const wrapElementExists = rule => ({ htmlDom }) => { 98 | const element = rule(htmlDom); 99 | if (element) { 100 | return 'true'; 101 | } 102 | return false; 103 | }; 104 | 105 | module.exports = () => { 106 | return ({ 107 | modified: [ 108 | wrapTime($ => $('meta[property="article:modified_time"]').attr('content')), 109 | ], 110 | image: [ 111 | wrapUrl($ => $('meta[property="og:image:secure_url"]').attr('content')), 112 | wrapUrl($ => $('meta[property="og:image:url"]').attr('content')), 113 | wrapUrl($ => $('meta[property="og:image"]').attr('content')), 114 | wrapUrl($ => $('meta[name="twitter:image:src"]').attr('content')), 115 | wrapUrl($ => $('meta[name="twitter:image"]').attr('content')), 116 | wrapUrl($ => $('meta[itemprop="image"]').attr('content')), 117 | wrapUrl($ => $('.issue-html td > a > img').attr('src')), 118 | ], 119 | siteTwitter: [ 120 | wrapTwitterHandle($ => $('meta[name="twitter:site"]').attr('content')), 121 | ], 122 | creatorTwitter: [ 123 | wrapTwitterHandle($ => $('meta[name="twitter:creator"]').attr('content')), 124 | ], 125 | keywords: [ 126 | wrapDevToTags($ => $('.tags > .tag').toArray().map(el => $(el).text())), 127 | wrapMediumTags($ => $('script[type="application/ld+json"]').html()), 128 | wrapProductHuntTags($ => $('script[type="application/ld+json"]').html()), 129 | wrapElementTextTags($ => $('.tags > a').toArray().map(el => $(el).text())), 130 | wrapDevToTags($ => $('.breadcrumbs > a').toArray().map(el => $(el).text())), 131 | wrapElementTextTags($ => $('.blog-tag').toArray().map(el => $(el).text())), 132 | wrapElementTextTags($ => $('.meta-box--tags > a').toArray().map(el => $(el).text())), 133 | wrapElementTextTags($ => $('.post .category').toArray().map(el => $(el).text())), 134 | wrapElementTextTags($ => $('.content-heading__secondary-categories a').toArray().map(el => $(el).text())), 135 | wrapElementTextTags($ => $('.post__tags a').toArray().map(el => $(el).text())), 136 | wrapElementTextTags($ => $('.tag a').toArray().map(el => $(el).text())), 137 | wrapElementTextTags($ => $('.entry-topic .cat-links a').toArray().map(el => $(el).text())), 138 | wrapElementTextTags($ => $('.Tag span.title').toArray().map(el => $(el).text())), 139 | wrapDevToTags($ => $('.post-full-meta a').toArray().map(el => $(el).text())), 140 | wrapElementTextTags($ => $('.blogPost__categories .categories__categoryLink').toArray().map(el => $(el).text())), 141 | wrapElementTextTags($ => $('.meta a.tag').toArray().map(el => $(el).text())), 142 | wrapElementTextTags($ => $('.content a.tag').toArray().map(el => $(el).text())), 143 | wrapElementTextTags($ => $('.post-footer .labels a').toArray().map(el => $(el).text())), 144 | wrapElementTextTags($ => $('.c-entry-group-labels__item a').toArray().map(el => $(el).text())), 145 | wrapElementTextTags($ => $('article .topics span.topic').toArray().map(el => $(el).text())), 146 | wrapElementTextTags($ => $('.tags .daily-tags').toArray().map(el => $(el).text().split(','))[0]), 147 | wrapElementTextTags($ => $('.cat-links a[rel="category tag"]').toArray().map(el => $(el).text())), 148 | // wrapKeywords($ => $('meta[name="keywords"]').attr('content')), 149 | ], 150 | readTime: [ 151 | wrapReadTime($ => $('.article__data').html()), 152 | wrapReadTime($ => $('.article-content').html()), 153 | wrapReadTime($ => $('.uni-paragraph').html()), 154 | wrapReadTime($ => $('.episode-body-summary').html()), 155 | wrapReadTime($ => $('article').html()), 156 | wrapReadTime($ => $('#readme').html()), 157 | wrapReadTime($ => $('.post__content').html()), 158 | wrapReadTime($ => $('.issue-html').html()), 159 | wrapReadTime($ => $('.rich-blog-post').html()), 160 | ], 161 | paid: [ 162 | wrapElementExists($ => $('article.meteredContent').html()), 163 | wrapMediumPaywall($ => $('svg').toArray().map(el => $(el))), 164 | ], 165 | title: [ 166 | wrapTitle($ => $('.issue .issue-title').text()), 167 | ...titleRules, 168 | ], 169 | isMediumComment: [ 170 | wrapElementExists($ => $('article > section:first-child a:first-child').html()), 171 | ], 172 | canonicalUrl: [ 173 | wrapUrl($ => $('link[rel="canonical"]').attr('href')), 174 | ], 175 | }); 176 | }; 177 | -------------------------------------------------------------------------------- /imager/.gcloudignore: -------------------------------------------------------------------------------- 1 | # This file specifies files that are *not* uploaded to Google Cloud Platform 2 | # using gcloud. It follows the same syntax as .gitignore, with the addition of 3 | # "#!include" directives (which insert the entries of the given .gitignore-style 4 | # file at that point). 5 | # 6 | # For more information, run: 7 | # $ gcloud topic gcloudignore 8 | # 9 | .gcloudignore 10 | # If you would like to upload your .git directory, .gitignore file or files 11 | # from your .gitignore file, remove the corresponding line 12 | # below: 13 | .git 14 | .gitignore 15 | 16 | node_modules 17 | -------------------------------------------------------------------------------- /imager/index.js: -------------------------------------------------------------------------------- 1 | const crypto = require('crypto'); 2 | const request = require('request-promise-native'); 3 | const sharp = require('sharp'); 4 | const { PubSub } = require(`@google-cloud/pubsub`); 5 | const cloudinary = require('cloudinary'); 6 | const pRetry = require('p-retry'); 7 | 8 | const pubsub = new PubSub(); 9 | 10 | const createOrGetTopic = (type) => { 11 | const topicName = `${type}-image-processed`; 12 | return pubsub.createTopic(topicName) 13 | .then((results) => { 14 | const topic = results[0]; 15 | console.log(`topic ${topic.name} created`); 16 | return topic; 17 | }) 18 | .catch((err) => { 19 | if (err.code === 6) { 20 | return pubsub.topic(topicName); 21 | } else { 22 | console.error('failed to create topic', err); 23 | } 24 | }); 25 | }; 26 | 27 | const checksum = (str, algorithm = 'md5', encoding = 'hex') => { 28 | return crypto 29 | .createHash(algorithm) 30 | .update(str, 'utf8') 31 | .digest(encoding); 32 | }; 33 | 34 | const uploadImage = (id, buffer, isGif, type, url) => { 35 | if (isGif) { 36 | return Promise.resolve(url); 37 | } 38 | 39 | const isSvg = url.indexOf('.svg') > 0; 40 | const fileName = checksum(buffer); 41 | const uploadPreset = isSvg ? undefined : `${type}_image`; 42 | 43 | console.log(`[${id}] uploading image ${fileName} with preset ${uploadPreset}`); 44 | 45 | return new Promise((resolve, reject) => { 46 | cloudinary.v2.uploader.upload_stream({ public_id: fileName, upload_preset: uploadPreset }, (err, res) => { 47 | if (err) { 48 | return reject(err); 49 | } 50 | 51 | resolve(cloudinary.v2.url(res.public_id, { secure: true, fetch_format: 'auto', quality: 'auto' })); 52 | }) 53 | .end(buffer); 54 | }); 55 | }; 56 | 57 | const moderateContent = (url, title) => { 58 | const exclude = ['escort', 'sex']; 59 | if (title) { 60 | const lower = title.toLowerCase(); 61 | const res = exclude.find(word => lower.indexOf(word) > -1); 62 | if (res) { 63 | return Promise.resolve(true); 64 | } 65 | } 66 | return Promise.resolve(false); 67 | }; 68 | 69 | const downloadAndUpload = (id, url, type) => { 70 | console.log(`[${id}] downloading ${url}`); 71 | return request({ 72 | method: 'GET', 73 | url, 74 | encoding: null, 75 | }).then((buffer) => { 76 | const image = sharp(buffer); 77 | return image.metadata() 78 | .then((info) => { 79 | console.log(`[${id}] processing image`); 80 | 81 | const ratio = info.width / info.height; 82 | const placeholderSize = Math.max(10, Math.floor(3 * ratio)); 83 | 84 | const isGif = info.format === 'gif'; 85 | const uploadPromise = uploadImage(id, buffer, isGif, type, url); 86 | 87 | const placeholderPromise = image.jpeg().resize(placeholderSize).toBuffer() 88 | .then(buffer => `data:image/jpeg;base64,${buffer.toString('base64')}`); 89 | 90 | return Promise.all([uploadPromise, placeholderPromise]) 91 | .then(res => ({ 92 | image: res[0], 93 | placeholder: res[1], 94 | ratio, 95 | })); 96 | }); 97 | }); 98 | }; 99 | 100 | const manipulateImage = (id, url, title, type = 'post') => { 101 | if (!url) { 102 | console.log(`[${id}] no image, skipping image processing`); 103 | return Promise.resolve({}); 104 | } 105 | 106 | return moderateContent(url, title) 107 | .then((rejected) => { 108 | if (rejected) { 109 | console.warn(`[${id}] image rejected ${url}`); 110 | return false; 111 | } 112 | 113 | return pRetry(() => downloadAndUpload(id, url, type), { retries: 5 }) 114 | .catch((err) => { 115 | console.warn(err); 116 | return {}; 117 | }); 118 | }) 119 | .catch((err) => { 120 | if (err.status === 400 || err.statusCode === 403) { 121 | console.warn(`[${id}] failed to check image ${url}`); 122 | return Promise.resolve({ image: null }); 123 | } 124 | throw err; 125 | }); 126 | }; 127 | 128 | exports.imager = (event) => { 129 | const data = JSON.parse(Buffer.from(event.data, 'base64').toString()); 130 | const type = data.type || 'post'; 131 | 132 | return manipulateImage(data.id, data.image, data.title, type) 133 | .then(res => { 134 | if (res) { 135 | const item = Object.assign({}, data, res); 136 | return createOrGetTopic(type) 137 | .then((topic) => { 138 | console.log(`[${data.id}] ${type} image processed`, item); 139 | return topic.publish(Buffer.from(JSON.stringify(item))); 140 | }); 141 | } else { 142 | console.warn(`[${data.id}] image rejected`); 143 | } 144 | }) 145 | .catch((err) => { 146 | console.warn(`[${data.id}] failed to process image`, data, err); 147 | return data; 148 | }); 149 | }; 150 | 151 | // manipulateImage('', 'https://istio.io/img/istio-whitelogo-bluebackground-framed.svg', 'title') 152 | // moderateContent('https://res.cloudinary.com/daily-now/image/upload/v1554148819/posts/f2d02c25a0221911f5446a8057872c05.jpg') 153 | // .then(console.log) 154 | // .catch(console.error); 155 | -------------------------------------------------------------------------------- /imager/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daily-imager", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@google-cloud/paginator": { 7 | "version": "3.0.5", 8 | "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.5.tgz", 9 | "integrity": "sha512-N4Uk4BT1YuskfRhKXBs0n9Lg2YTROZc6IMpkO/8DIHODtm5s3xY8K5vVBo23v/2XulY3azwITQlYWgT4GdLsUw==", 10 | "requires": { 11 | "arrify": "^2.0.0", 12 | "extend": "^3.0.2" 13 | } 14 | }, 15 | "@google-cloud/precise-date": { 16 | "version": "2.0.3", 17 | "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-2.0.3.tgz", 18 | "integrity": "sha512-+SDJ3ZvGkF7hzo6BGa8ZqeK3F6Z4+S+KviC9oOK+XCs3tfMyJCh/4j93XIWINgMMDIh9BgEvlw4306VxlXIlYA==" 19 | }, 20 | "@google-cloud/projectify": { 21 | "version": "2.0.1", 22 | "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.0.1.tgz", 23 | "integrity": "sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ==" 24 | }, 25 | "@google-cloud/promisify": { 26 | "version": "0.4.0", 27 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-0.4.0.tgz", 28 | "integrity": "sha512-4yAHDC52TEMCNcMzVC8WlqnKKKq+Ssi2lXoUg9zWWkZ6U6tq9ZBRYLHHCRdfU+EU9YJsVmivwGcKYCjRGjnf4Q==" 29 | }, 30 | "@google-cloud/pubsub": { 31 | "version": "2.7.0", 32 | "resolved": "https://registry.npmjs.org/@google-cloud/pubsub/-/pubsub-2.7.0.tgz", 33 | "integrity": "sha512-wc/XOo5Ibo3GWmuaLu80EBIhXSdu2vf99HUqBbdsSSkmRNIka2HqoIhLlOFnnncQn0lZnGL7wtKGIDLoH9LiBg==", 34 | "requires": { 35 | "@google-cloud/paginator": "^3.0.0", 36 | "@google-cloud/precise-date": "^2.0.0", 37 | "@google-cloud/projectify": "^2.0.0", 38 | "@google-cloud/promisify": "^2.0.0", 39 | "@opentelemetry/api": "^0.11.0", 40 | "@opentelemetry/tracing": "^0.11.0", 41 | "@types/duplexify": "^3.6.0", 42 | "@types/long": "^4.0.0", 43 | "arrify": "^2.0.0", 44 | "extend": "^3.0.2", 45 | "google-auth-library": "^6.1.2", 46 | "google-gax": "^2.9.2", 47 | "is-stream-ended": "^0.1.4", 48 | "lodash.snakecase": "^4.1.1", 49 | "p-defer": "^3.0.0" 50 | }, 51 | "dependencies": { 52 | "@google-cloud/promisify": { 53 | "version": "2.0.3", 54 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.3.tgz", 55 | "integrity": "sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw==" 56 | }, 57 | "@types/long": { 58 | "version": "4.0.1", 59 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 60 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 61 | } 62 | } 63 | }, 64 | "@google-cloud/vision": { 65 | "version": "0.25.0", 66 | "resolved": "https://registry.npmjs.org/@google-cloud/vision/-/vision-0.25.0.tgz", 67 | "integrity": "sha512-oVneZvYy32aEDKbqA8p0N7Pap4LuNdCdHoyc/9gn3BR1CDFvcZmdD48zLOTeGssW0IKBYtAPMyMdLLrAvyEVwg==", 68 | "requires": { 69 | "@google-cloud/promisify": "^0.4.0", 70 | "google-gax": "^0.25.0", 71 | "is": "^3.2.1", 72 | "lodash.merge": "^4.6.1", 73 | "protobufjs": "^6.8.6" 74 | }, 75 | "dependencies": { 76 | "@types/long": { 77 | "version": "4.0.1", 78 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 79 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 80 | }, 81 | "@types/node": { 82 | "version": "10.17.19", 83 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.19.tgz", 84 | "integrity": "sha512-46/xThm3zvvc9t9/7M3AaLEqtOpqlYYYcCZbpYVAQHG20+oMZBkae/VMrn4BTi6AJ8cpack0mEXhGiKmDNbLrQ==" 85 | }, 86 | "debug": { 87 | "version": "4.1.1", 88 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 89 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 90 | "requires": { 91 | "ms": "^2.1.1" 92 | } 93 | }, 94 | "gcp-metadata": { 95 | "version": "1.0.0", 96 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-1.0.0.tgz", 97 | "integrity": "sha512-Q6HrgfrCQeEircnNP3rCcEgiDv7eF9+1B+1MMgpE190+/+0mjQR8PxeOaRgxZWmdDAF9EIryHB9g1moPiw1SbQ==", 98 | "requires": { 99 | "gaxios": "^1.0.2", 100 | "json-bigint": "^0.3.0" 101 | }, 102 | "dependencies": { 103 | "json-bigint": { 104 | "version": "0.3.0", 105 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", 106 | "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", 107 | "requires": { 108 | "bignumber.js": "^7.0.0" 109 | } 110 | } 111 | } 112 | }, 113 | "google-auth-library": { 114 | "version": "3.1.2", 115 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.1.2.tgz", 116 | "integrity": "sha512-cDQMzTotwyWMrg5jRO7q0A4TL/3GWBgO7I7q5xGKNiiFf9SmGY/OJ1YsLMgI2MVHHsEGyrqYnbnmV1AE+Z6DnQ==", 117 | "requires": { 118 | "base64-js": "^1.3.0", 119 | "fast-text-encoding": "^1.0.0", 120 | "gaxios": "^1.2.1", 121 | "gcp-metadata": "^1.0.0", 122 | "gtoken": "^2.3.2", 123 | "https-proxy-agent": "^2.2.1", 124 | "jws": "^3.1.5", 125 | "lru-cache": "^5.0.0", 126 | "semver": "^5.5.0" 127 | }, 128 | "dependencies": { 129 | "base64-js": { 130 | "version": "1.3.1", 131 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 132 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 133 | }, 134 | "fast-text-encoding": { 135 | "version": "1.0.1", 136 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.1.tgz", 137 | "integrity": "sha512-x4FEgaz3zNRtJfLFqJmHWxkMDDvXVtaznj2V9jiP8ACUJrUgist4bP9FmDL2Vew2Y9mEQI/tG4GqabaitYp9CQ==" 138 | }, 139 | "semver": { 140 | "version": "5.7.1", 141 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 142 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 143 | } 144 | } 145 | }, 146 | "google-gax": { 147 | "version": "0.25.6", 148 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.25.6.tgz", 149 | "integrity": "sha512-+CVtOSLQt42mwVvJJirhBiAvWsp8zKeb9zW5Wy3wyvb3VG9OugHzZpwvYO9D4yNPPspe7L9CpIs80I5nUJlS8w==", 150 | "requires": { 151 | "@grpc/grpc-js": "^0.3.0", 152 | "@grpc/proto-loader": "^0.4.0", 153 | "duplexify": "^3.6.0", 154 | "google-auth-library": "^3.0.0", 155 | "google-proto-files": "^0.20.0", 156 | "grpc": "^1.16.0", 157 | "grpc-gcp": "^0.1.1", 158 | "is-stream-ended": "^0.1.4", 159 | "lodash.at": "^4.6.0", 160 | "lodash.has": "^4.5.2", 161 | "protobufjs": "^6.8.8", 162 | "retry-request": "^4.0.0", 163 | "semver": "^6.0.0", 164 | "walkdir": "^0.3.2" 165 | }, 166 | "dependencies": { 167 | "@grpc/grpc-js": { 168 | "version": "0.3.6", 169 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.3.6.tgz", 170 | "integrity": "sha512-SmLNuPGlUur64bNS9aHZguqWDVQ8+Df1CGn+xsh7l6T2wiP5ArOMlywZ3TZo6z/rwKtGQgUJY9ZrPYUmHEXd/Q==", 171 | "requires": { 172 | "semver": "^5.5.0" 173 | }, 174 | "dependencies": { 175 | "semver": { 176 | "version": "5.7.1", 177 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 178 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 179 | } 180 | } 181 | }, 182 | "@grpc/proto-loader": { 183 | "version": "0.4.0", 184 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.4.0.tgz", 185 | "integrity": "sha512-Jm6o+75uWT7E6+lt8edg4J1F/9+BedOjaMgwE14pxS/AO43/0ZqK+rCLVVrXLoExwSAZvgvOD2B0ivy3Spsspw==", 186 | "requires": { 187 | "lodash.camelcase": "^4.3.0", 188 | "protobufjs": "^6.8.6" 189 | } 190 | }, 191 | "grpc-gcp": { 192 | "version": "0.1.1", 193 | "resolved": "https://registry.npmjs.org/grpc-gcp/-/grpc-gcp-0.1.1.tgz", 194 | "integrity": "sha512-MAt0Ae9QuL2Lbbt2d+kDta5AxqRD1JVXtBcJuQKp9GeFL5TxPw/hxIyDNyivPjKEXjbG3cBGwSE3CXq6a3KHEQ==", 195 | "requires": { 196 | "grpc": "^1.16.0", 197 | "protobufjs": "^6.8.8" 198 | } 199 | }, 200 | "lodash.at": { 201 | "version": "4.6.0", 202 | "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", 203 | "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=" 204 | }, 205 | "lodash.camelcase": { 206 | "version": "4.3.0", 207 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 208 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 209 | }, 210 | "lodash.has": { 211 | "version": "4.5.2", 212 | "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", 213 | "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" 214 | }, 215 | "protobufjs": { 216 | "version": "6.8.9", 217 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.9.tgz", 218 | "integrity": "sha512-j2JlRdUeL/f4Z6x4aU4gj9I2LECglC+5qR2TrWb193Tla1qfdaNQTZ8I27Pt7K0Ajmvjjpft7O3KWTGciz4gpw==", 219 | "requires": { 220 | "@protobufjs/aspromise": "^1.1.2", 221 | "@protobufjs/base64": "^1.1.2", 222 | "@protobufjs/codegen": "^2.0.4", 223 | "@protobufjs/eventemitter": "^1.1.0", 224 | "@protobufjs/fetch": "^1.1.0", 225 | "@protobufjs/float": "^1.0.2", 226 | "@protobufjs/inquire": "^1.1.0", 227 | "@protobufjs/path": "^1.1.2", 228 | "@protobufjs/pool": "^1.1.0", 229 | "@protobufjs/utf8": "^1.1.0", 230 | "@types/long": "^4.0.0", 231 | "@types/node": "^10.1.0", 232 | "long": "^4.0.0" 233 | } 234 | }, 235 | "walkdir": { 236 | "version": "0.3.2", 237 | "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.3.2.tgz", 238 | "integrity": "sha512-0Twghia4Z5wDGDYWURlhZmI47GvERMCsXIu0QZWVVZyW9ZjpbbZvD9Zy9M6cWiQQRRbAcYajIyKNavaZZDt1Uw==" 239 | } 240 | } 241 | }, 242 | "google-proto-files": { 243 | "version": "0.20.0", 244 | "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.20.0.tgz", 245 | "integrity": "sha512-ORU+XhOeDv/UPtnCYLkO1ItmfhRCRPR3ZoeVQ7GfVzEs7PVitPIhsYlY5ZzG8XXnsdmtK27ENurfQ1jhAWpZHg==", 246 | "requires": { 247 | "@google-cloud/promisify": "^0.4.0", 248 | "protobufjs": "^6.8.0", 249 | "walkdir": "^0.3.0" 250 | }, 251 | "dependencies": { 252 | "walkdir": { 253 | "version": "0.3.2", 254 | "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.3.2.tgz", 255 | "integrity": "sha512-0Twghia4Z5wDGDYWURlhZmI47GvERMCsXIu0QZWVVZyW9ZjpbbZvD9Zy9M6cWiQQRRbAcYajIyKNavaZZDt1Uw==" 256 | } 257 | } 258 | }, 259 | "lru-cache": { 260 | "version": "5.1.1", 261 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 262 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 263 | "requires": { 264 | "yallist": "^3.0.2" 265 | } 266 | }, 267 | "ms": { 268 | "version": "2.1.2", 269 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 270 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 271 | }, 272 | "retry-request": { 273 | "version": "4.1.1", 274 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz", 275 | "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==", 276 | "requires": { 277 | "debug": "^4.1.1", 278 | "through2": "^3.0.1" 279 | }, 280 | "dependencies": { 281 | "through2": { 282 | "version": "3.0.1", 283 | "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", 284 | "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", 285 | "requires": { 286 | "readable-stream": "2 || 3" 287 | } 288 | } 289 | } 290 | }, 291 | "semver": { 292 | "version": "6.3.0", 293 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 294 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 295 | } 296 | } 297 | }, 298 | "@grpc/grpc-js": { 299 | "version": "1.2.2", 300 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.2.2.tgz", 301 | "integrity": "sha512-iK/T984Ni6VnmlQK/LJdUk+VsXSaYIWkgzJ0LyOcxN2SowAmoRjG28kS7B1ui/q/MAv42iM3051WBt5QorFxmg==", 302 | "requires": { 303 | "@types/node": "^12.12.47", 304 | "google-auth-library": "^6.1.1", 305 | "semver": "^6.2.0" 306 | }, 307 | "dependencies": { 308 | "@types/node": { 309 | "version": "12.19.12", 310 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", 311 | "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==" 312 | }, 313 | "semver": { 314 | "version": "6.3.0", 315 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 316 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 317 | } 318 | } 319 | }, 320 | "@grpc/proto-loader": { 321 | "version": "0.5.5", 322 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz", 323 | "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==", 324 | "requires": { 325 | "lodash.camelcase": "^4.3.0", 326 | "protobufjs": "^6.8.6" 327 | } 328 | }, 329 | "@mapbox/node-pre-gyp": { 330 | "version": "1.0.5", 331 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", 332 | "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", 333 | "requires": { 334 | "detect-libc": "^1.0.3", 335 | "https-proxy-agent": "^5.0.0", 336 | "make-dir": "^3.1.0", 337 | "node-fetch": "^2.6.1", 338 | "nopt": "^5.0.0", 339 | "npmlog": "^4.1.2", 340 | "rimraf": "^3.0.2", 341 | "semver": "^7.3.4", 342 | "tar": "^6.1.0" 343 | }, 344 | "dependencies": { 345 | "chownr": { 346 | "version": "2.0.0", 347 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 348 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" 349 | }, 350 | "debug": { 351 | "version": "4.3.1", 352 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 353 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 354 | "requires": { 355 | "ms": "2.1.2" 356 | } 357 | }, 358 | "fs-minipass": { 359 | "version": "2.1.0", 360 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 361 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 362 | "requires": { 363 | "minipass": "^3.0.0" 364 | } 365 | }, 366 | "https-proxy-agent": { 367 | "version": "5.0.0", 368 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 369 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 370 | "requires": { 371 | "agent-base": "6", 372 | "debug": "4" 373 | } 374 | }, 375 | "minipass": { 376 | "version": "3.1.3", 377 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", 378 | "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", 379 | "requires": { 380 | "yallist": "^4.0.0" 381 | } 382 | }, 383 | "minizlib": { 384 | "version": "2.1.2", 385 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 386 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 387 | "requires": { 388 | "minipass": "^3.0.0", 389 | "yallist": "^4.0.0" 390 | } 391 | }, 392 | "mkdirp": { 393 | "version": "1.0.4", 394 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 395 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 396 | }, 397 | "ms": { 398 | "version": "2.1.2", 399 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 400 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 401 | }, 402 | "semver": { 403 | "version": "7.3.5", 404 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 405 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 406 | "requires": { 407 | "lru-cache": "^6.0.0" 408 | } 409 | }, 410 | "yallist": { 411 | "version": "4.0.0", 412 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 413 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 414 | } 415 | } 416 | }, 417 | "@opentelemetry/api": { 418 | "version": "0.11.0", 419 | "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.11.0.tgz", 420 | "integrity": "sha512-K+1ADLMxduhsXoZ0GRfi9Pw162FvzBQLDQlHru1lg86rpIU+4XqdJkSGo6y3Kg+GmOWq1HNHOA/ydw/rzHQkRg==", 421 | "requires": { 422 | "@opentelemetry/context-base": "^0.11.0" 423 | } 424 | }, 425 | "@opentelemetry/context-base": { 426 | "version": "0.11.0", 427 | "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.11.0.tgz", 428 | "integrity": "sha512-ESRk+572bftles7CVlugAj5Azrz61VO0MO0TS2pE9MLVL/zGmWuUBQryART6/nsrFqo+v9HPt37GPNcECTZR1w==" 429 | }, 430 | "@opentelemetry/core": { 431 | "version": "0.11.0", 432 | "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.11.0.tgz", 433 | "integrity": "sha512-ZEKjBXeDGBqzouz0uJmrbEKNExEsQOhsZ3tJDCLcz5dUNoVw642oIn2LYWdQK2YdIfZbEmltiF65/csGsaBtFA==", 434 | "requires": { 435 | "@opentelemetry/api": "^0.11.0", 436 | "@opentelemetry/context-base": "^0.11.0", 437 | "semver": "^7.1.3" 438 | }, 439 | "dependencies": { 440 | "semver": { 441 | "version": "7.3.4", 442 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", 443 | "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", 444 | "requires": { 445 | "lru-cache": "^6.0.0" 446 | } 447 | } 448 | } 449 | }, 450 | "@opentelemetry/resources": { 451 | "version": "0.11.0", 452 | "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.11.0.tgz", 453 | "integrity": "sha512-o7DwV1TcezqBtS5YW2AWBcn01nVpPptIbTr966PLlVBcS//w8LkjeOShiSZxQ0lmV4b2en0FiSouSDoXk/5qIQ==", 454 | "requires": { 455 | "@opentelemetry/api": "^0.11.0", 456 | "@opentelemetry/core": "^0.11.0" 457 | } 458 | }, 459 | "@opentelemetry/semantic-conventions": { 460 | "version": "0.11.0", 461 | "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.11.0.tgz", 462 | "integrity": "sha512-xsthnI/J+Cx0YVDGgUzvrH0ZTtfNtl866M454NarYwDrc0JvC24sYw+XS5PJyk2KDzAHtb0vlrumUc1OAut/Fw==" 463 | }, 464 | "@opentelemetry/tracing": { 465 | "version": "0.11.0", 466 | "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.11.0.tgz", 467 | "integrity": "sha512-QweFmxzl32BcyzwdWCNjVXZT1WeENNS/RWETq/ohqu+fAsTcMyGcr6cOq/yDdFmtBy+bm5WVVdeByEjNS+c4/w==", 468 | "requires": { 469 | "@opentelemetry/api": "^0.11.0", 470 | "@opentelemetry/context-base": "^0.11.0", 471 | "@opentelemetry/core": "^0.11.0", 472 | "@opentelemetry/resources": "^0.11.0", 473 | "@opentelemetry/semantic-conventions": "^0.11.0" 474 | } 475 | }, 476 | "@protobufjs/aspromise": { 477 | "version": "1.1.2", 478 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 479 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 480 | }, 481 | "@protobufjs/base64": { 482 | "version": "1.1.2", 483 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 484 | "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU=" 485 | }, 486 | "@protobufjs/codegen": { 487 | "version": "2.0.4", 488 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 489 | "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs=" 490 | }, 491 | "@protobufjs/eventemitter": { 492 | "version": "1.1.0", 493 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 494 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 495 | }, 496 | "@protobufjs/fetch": { 497 | "version": "1.1.0", 498 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 499 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 500 | "requires": { 501 | "@protobufjs/aspromise": "^1.1.1", 502 | "@protobufjs/inquire": "^1.1.0" 503 | } 504 | }, 505 | "@protobufjs/float": { 506 | "version": "1.0.2", 507 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 508 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 509 | }, 510 | "@protobufjs/inquire": { 511 | "version": "1.1.0", 512 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 513 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 514 | }, 515 | "@protobufjs/path": { 516 | "version": "1.1.2", 517 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 518 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 519 | }, 520 | "@protobufjs/pool": { 521 | "version": "1.1.0", 522 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 523 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 524 | }, 525 | "@protobufjs/utf8": { 526 | "version": "1.1.0", 527 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 528 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 529 | }, 530 | "@types/bytebuffer": { 531 | "version": "5.0.42", 532 | "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.42.tgz", 533 | "integrity": "sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw==", 534 | "requires": { 535 | "@types/long": "*", 536 | "@types/node": "*" 537 | } 538 | }, 539 | "@types/duplexify": { 540 | "version": "3.6.0", 541 | "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.0.tgz", 542 | "integrity": "sha512-5zOA53RUlzN74bvrSGwjudssD9F3a797sDZQkiYpUOxW+WHaXTCPz4/d5Dgi6FKnOqZ2CpaTo0DhgIfsXAOE/A==", 543 | "requires": { 544 | "@types/node": "*" 545 | } 546 | }, 547 | "@types/long": { 548 | "version": "3.0.32", 549 | "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", 550 | "integrity": "sha1-9OWvMenpsZbY5fyopeLiCqPWC2k=" 551 | }, 552 | "@types/node": { 553 | "version": "8.10.21", 554 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.21.tgz", 555 | "integrity": "sha1-ErPyNZsnqgWkXYhsi6HrjRp34oU=" 556 | }, 557 | "abbrev": { 558 | "version": "1.1.1", 559 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 560 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 561 | }, 562 | "abort-controller": { 563 | "version": "2.0.2", 564 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-2.0.2.tgz", 565 | "integrity": "sha512-JXEYGxxMwiNl9EUdLysK0K0DwB7ENw6KeeaLHgofijTfJYPB/vOer3Mb+IcP913dCfWiQsd05MmVNl0H5PanrQ==", 566 | "requires": { 567 | "event-target-shim": "^5.0.0" 568 | } 569 | }, 570 | "agent-base": { 571 | "version": "6.0.2", 572 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 573 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 574 | "requires": { 575 | "debug": "4" 576 | }, 577 | "dependencies": { 578 | "debug": { 579 | "version": "4.3.1", 580 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 581 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 582 | "requires": { 583 | "ms": "2.1.2" 584 | } 585 | }, 586 | "ms": { 587 | "version": "2.1.2", 588 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 589 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 590 | } 591 | } 592 | }, 593 | "ajv": { 594 | "version": "6.10.1", 595 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz", 596 | "integrity": "sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ==", 597 | "requires": { 598 | "fast-deep-equal": "^2.0.1", 599 | "fast-json-stable-stringify": "^2.0.0", 600 | "json-schema-traverse": "^0.4.1", 601 | "uri-js": "^4.2.2" 602 | } 603 | }, 604 | "ansi-regex": { 605 | "version": "2.1.1", 606 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 607 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 608 | }, 609 | "aproba": { 610 | "version": "1.2.0", 611 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 612 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 613 | }, 614 | "are-we-there-yet": { 615 | "version": "1.1.5", 616 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 617 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 618 | "requires": { 619 | "delegates": "^1.0.0", 620 | "readable-stream": "^2.0.6" 621 | } 622 | }, 623 | "arrify": { 624 | "version": "2.0.1", 625 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 626 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" 627 | }, 628 | "ascli": { 629 | "version": "1.0.1", 630 | "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", 631 | "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", 632 | "requires": { 633 | "colour": "~0.7.1", 634 | "optjs": "~3.2.2" 635 | } 636 | }, 637 | "asn1": { 638 | "version": "0.2.4", 639 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 640 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 641 | "requires": { 642 | "safer-buffer": "~2.1.0" 643 | } 644 | }, 645 | "assert-plus": { 646 | "version": "1.0.0", 647 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 648 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 649 | }, 650 | "asynckit": { 651 | "version": "0.4.0", 652 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 653 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 654 | }, 655 | "aws-sign2": { 656 | "version": "0.7.0", 657 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 658 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 659 | }, 660 | "aws4": { 661 | "version": "1.8.0", 662 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 663 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 664 | }, 665 | "balanced-match": { 666 | "version": "1.0.2", 667 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 668 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 669 | }, 670 | "base64-js": { 671 | "version": "1.5.1", 672 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 673 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 674 | }, 675 | "bcrypt-pbkdf": { 676 | "version": "1.0.2", 677 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 678 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 679 | "requires": { 680 | "tweetnacl": "^0.14.3" 681 | } 682 | }, 683 | "bignumber.js": { 684 | "version": "7.2.1", 685 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", 686 | "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" 687 | }, 688 | "bl": { 689 | "version": "1.2.3", 690 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", 691 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", 692 | "requires": { 693 | "readable-stream": "^2.3.5", 694 | "safe-buffer": "^5.1.1" 695 | } 696 | }, 697 | "brace-expansion": { 698 | "version": "1.1.11", 699 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 700 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 701 | "requires": { 702 | "balanced-match": "^1.0.0", 703 | "concat-map": "0.0.1" 704 | } 705 | }, 706 | "buffer-alloc": { 707 | "version": "1.2.0", 708 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 709 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 710 | "requires": { 711 | "buffer-alloc-unsafe": "^1.1.0", 712 | "buffer-fill": "^1.0.0" 713 | } 714 | }, 715 | "buffer-alloc-unsafe": { 716 | "version": "1.1.0", 717 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 718 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 719 | }, 720 | "buffer-equal-constant-time": { 721 | "version": "1.0.1", 722 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 723 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 724 | }, 725 | "buffer-fill": { 726 | "version": "1.0.0", 727 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 728 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" 729 | }, 730 | "bytebuffer": { 731 | "version": "5.0.1", 732 | "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", 733 | "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", 734 | "requires": { 735 | "long": "~3" 736 | }, 737 | "dependencies": { 738 | "long": { 739 | "version": "3.2.0", 740 | "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", 741 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" 742 | } 743 | } 744 | }, 745 | "camelcase": { 746 | "version": "2.1.1", 747 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 748 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 749 | }, 750 | "caseless": { 751 | "version": "0.12.0", 752 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 753 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 754 | }, 755 | "chownr": { 756 | "version": "1.1.2", 757 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", 758 | "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" 759 | }, 760 | "cliui": { 761 | "version": "3.2.0", 762 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 763 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 764 | "requires": { 765 | "string-width": "^1.0.1", 766 | "strip-ansi": "^3.0.1", 767 | "wrap-ansi": "^2.0.0" 768 | } 769 | }, 770 | "cloudinary": { 771 | "version": "1.14.0", 772 | "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.14.0.tgz", 773 | "integrity": "sha512-auJY4aD1UGnQTD2iy6kuTA+FJsqyrr9svG12WYSPAO6oRGRf+16UFDDBNuRMm37wj8Tyn8LyiED0b+Jha36ORA==", 774 | "requires": { 775 | "lodash": "^4.17.11", 776 | "q": "^1.5.1" 777 | } 778 | }, 779 | "code-point-at": { 780 | "version": "1.1.0", 781 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 782 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 783 | }, 784 | "color": { 785 | "version": "3.1.2", 786 | "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", 787 | "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", 788 | "requires": { 789 | "color-convert": "^1.9.1", 790 | "color-string": "^1.5.2" 791 | } 792 | }, 793 | "color-convert": { 794 | "version": "1.9.3", 795 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 796 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 797 | "requires": { 798 | "color-name": "1.1.3" 799 | } 800 | }, 801 | "color-name": { 802 | "version": "1.1.3", 803 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 804 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 805 | }, 806 | "color-string": { 807 | "version": "1.6.0", 808 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", 809 | "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", 810 | "requires": { 811 | "color-name": "^1.0.0", 812 | "simple-swizzle": "^0.2.2" 813 | } 814 | }, 815 | "colour": { 816 | "version": "0.7.1", 817 | "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", 818 | "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" 819 | }, 820 | "combined-stream": { 821 | "version": "1.0.8", 822 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 823 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 824 | "requires": { 825 | "delayed-stream": "~1.0.0" 826 | } 827 | }, 828 | "concat-map": { 829 | "version": "0.0.1", 830 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 831 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 832 | }, 833 | "console-control-strings": { 834 | "version": "1.1.0", 835 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 836 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 837 | }, 838 | "core-util-is": { 839 | "version": "1.0.2", 840 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 841 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 842 | }, 843 | "dashdash": { 844 | "version": "1.14.1", 845 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 846 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 847 | "requires": { 848 | "assert-plus": "^1.0.0" 849 | } 850 | }, 851 | "debug": { 852 | "version": "3.1.0", 853 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 854 | "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", 855 | "requires": { 856 | "ms": "2.0.0" 857 | } 858 | }, 859 | "decamelize": { 860 | "version": "1.2.0", 861 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 862 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 863 | }, 864 | "decompress-response": { 865 | "version": "3.3.0", 866 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 867 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 868 | "requires": { 869 | "mimic-response": "^1.0.0" 870 | } 871 | }, 872 | "deep-extend": { 873 | "version": "0.6.0", 874 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 875 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 876 | }, 877 | "delayed-stream": { 878 | "version": "1.0.0", 879 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 880 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 881 | }, 882 | "delegates": { 883 | "version": "1.0.0", 884 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 885 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 886 | }, 887 | "detect-libc": { 888 | "version": "1.0.3", 889 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 890 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 891 | }, 892 | "duplexify": { 893 | "version": "3.6.0", 894 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", 895 | "integrity": "sha1-WSkD9dgLONA3IgVBJk1poZj7NBA=", 896 | "requires": { 897 | "end-of-stream": "^1.0.0", 898 | "inherits": "^2.0.1", 899 | "readable-stream": "^2.0.0", 900 | "stream-shift": "^1.0.0" 901 | } 902 | }, 903 | "ecc-jsbn": { 904 | "version": "0.1.2", 905 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 906 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 907 | "requires": { 908 | "jsbn": "~0.1.0", 909 | "safer-buffer": "^2.1.0" 910 | } 911 | }, 912 | "ecdsa-sig-formatter": { 913 | "version": "1.0.10", 914 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", 915 | "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", 916 | "requires": { 917 | "safe-buffer": "^5.0.1" 918 | } 919 | }, 920 | "end-of-stream": { 921 | "version": "1.4.1", 922 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 923 | "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", 924 | "requires": { 925 | "once": "^1.4.0" 926 | } 927 | }, 928 | "es6-promise": { 929 | "version": "4.2.6", 930 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", 931 | "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" 932 | }, 933 | "es6-promisify": { 934 | "version": "5.0.0", 935 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 936 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 937 | "requires": { 938 | "es6-promise": "^4.0.3" 939 | } 940 | }, 941 | "event-target-shim": { 942 | "version": "5.0.1", 943 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 944 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 945 | }, 946 | "expand-template": { 947 | "version": "1.1.1", 948 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", 949 | "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==" 950 | }, 951 | "extend": { 952 | "version": "3.0.2", 953 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 954 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 955 | }, 956 | "extsprintf": { 957 | "version": "1.3.0", 958 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 959 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 960 | }, 961 | "fast-deep-equal": { 962 | "version": "2.0.1", 963 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 964 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 965 | }, 966 | "fast-json-stable-stringify": { 967 | "version": "2.0.0", 968 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 969 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 970 | }, 971 | "fast-text-encoding": { 972 | "version": "1.0.3", 973 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", 974 | "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" 975 | }, 976 | "forever-agent": { 977 | "version": "0.6.1", 978 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 979 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 980 | }, 981 | "form-data": { 982 | "version": "2.3.3", 983 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 984 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 985 | "requires": { 986 | "asynckit": "^0.4.0", 987 | "combined-stream": "^1.0.6", 988 | "mime-types": "^2.1.12" 989 | } 990 | }, 991 | "fs-constants": { 992 | "version": "1.0.0", 993 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 994 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 995 | }, 996 | "fs-copy-file-sync": { 997 | "version": "1.1.1", 998 | "resolved": "https://registry.npmjs.org/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz", 999 | "integrity": "sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ==" 1000 | }, 1001 | "fs-minipass": { 1002 | "version": "1.2.7", 1003 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 1004 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 1005 | "requires": { 1006 | "minipass": "^2.6.0" 1007 | } 1008 | }, 1009 | "fs.realpath": { 1010 | "version": "1.0.0", 1011 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1012 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 1013 | }, 1014 | "gauge": { 1015 | "version": "2.7.4", 1016 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 1017 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 1018 | "requires": { 1019 | "aproba": "^1.0.3", 1020 | "console-control-strings": "^1.0.0", 1021 | "has-unicode": "^2.0.0", 1022 | "object-assign": "^4.1.0", 1023 | "signal-exit": "^3.0.0", 1024 | "string-width": "^1.0.1", 1025 | "strip-ansi": "^3.0.1", 1026 | "wide-align": "^1.1.0" 1027 | } 1028 | }, 1029 | "gaxios": { 1030 | "version": "1.8.1", 1031 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.8.1.tgz", 1032 | "integrity": "sha512-RPm2L7qDjo6FgSle5+v2LvDO/eN+/H9jqmX8PJUAQZVmSXBqDDgP/TFSNhC6RMgRDPav7JclkbQjVjos4P6V8A==", 1033 | "requires": { 1034 | "abort-controller": "^2.0.2", 1035 | "extend": "^3.0.2", 1036 | "https-proxy-agent": "^2.2.1", 1037 | "node-fetch": "^2.3.0" 1038 | }, 1039 | "dependencies": { 1040 | "extend": { 1041 | "version": "3.0.2", 1042 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1043 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 1044 | } 1045 | } 1046 | }, 1047 | "gcp-metadata": { 1048 | "version": "4.2.1", 1049 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.1.tgz", 1050 | "integrity": "sha512-tSk+REe5iq/N+K+SK1XjZJUrFPuDqGZVzCy2vocIHIGmPlTGsa8owXMJwGkrXr73NO0AzhPW4MF2DEHz7P2AVw==", 1051 | "requires": { 1052 | "gaxios": "^4.0.0", 1053 | "json-bigint": "^1.0.0" 1054 | }, 1055 | "dependencies": { 1056 | "abort-controller": { 1057 | "version": "3.0.0", 1058 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 1059 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 1060 | "requires": { 1061 | "event-target-shim": "^5.0.0" 1062 | } 1063 | }, 1064 | "debug": { 1065 | "version": "4.3.1", 1066 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1067 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1068 | "requires": { 1069 | "ms": "2.1.2" 1070 | } 1071 | }, 1072 | "gaxios": { 1073 | "version": "4.1.0", 1074 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.1.0.tgz", 1075 | "integrity": "sha512-vb0to8xzGnA2qcgywAjtshOKKVDf2eQhJoiL6fHhgW5tVN7wNk7egnYIO9zotfn3lQ3De1VPdf7V5/BWfCtCmg==", 1076 | "requires": { 1077 | "abort-controller": "^3.0.0", 1078 | "extend": "^3.0.2", 1079 | "https-proxy-agent": "^5.0.0", 1080 | "is-stream": "^2.0.0", 1081 | "node-fetch": "^2.3.0" 1082 | } 1083 | }, 1084 | "https-proxy-agent": { 1085 | "version": "5.0.0", 1086 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 1087 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 1088 | "requires": { 1089 | "agent-base": "6", 1090 | "debug": "4" 1091 | } 1092 | }, 1093 | "ms": { 1094 | "version": "2.1.2", 1095 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1096 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1097 | } 1098 | } 1099 | }, 1100 | "getpass": { 1101 | "version": "0.1.7", 1102 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1103 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1104 | "requires": { 1105 | "assert-plus": "^1.0.0" 1106 | } 1107 | }, 1108 | "github-from-package": { 1109 | "version": "0.0.0", 1110 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 1111 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" 1112 | }, 1113 | "glob": { 1114 | "version": "7.1.7", 1115 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 1116 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 1117 | "requires": { 1118 | "fs.realpath": "^1.0.0", 1119 | "inflight": "^1.0.4", 1120 | "inherits": "2", 1121 | "minimatch": "^3.0.4", 1122 | "once": "^1.3.0", 1123 | "path-is-absolute": "^1.0.0" 1124 | } 1125 | }, 1126 | "google-auth-library": { 1127 | "version": "6.1.3", 1128 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.3.tgz", 1129 | "integrity": "sha512-m9mwvY3GWbr7ZYEbl61isWmk+fvTmOt0YNUfPOUY2VH8K5pZlAIWJjxEi0PqR3OjMretyiQLI6GURMrPSwHQ2g==", 1130 | "requires": { 1131 | "arrify": "^2.0.0", 1132 | "base64-js": "^1.3.0", 1133 | "ecdsa-sig-formatter": "^1.0.11", 1134 | "fast-text-encoding": "^1.0.0", 1135 | "gaxios": "^4.0.0", 1136 | "gcp-metadata": "^4.2.0", 1137 | "gtoken": "^5.0.4", 1138 | "jws": "^4.0.0", 1139 | "lru-cache": "^6.0.0" 1140 | }, 1141 | "dependencies": { 1142 | "abort-controller": { 1143 | "version": "3.0.0", 1144 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 1145 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 1146 | "requires": { 1147 | "event-target-shim": "^5.0.0" 1148 | } 1149 | }, 1150 | "debug": { 1151 | "version": "4.3.1", 1152 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1153 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1154 | "requires": { 1155 | "ms": "2.1.2" 1156 | } 1157 | }, 1158 | "ecdsa-sig-formatter": { 1159 | "version": "1.0.11", 1160 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 1161 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 1162 | "requires": { 1163 | "safe-buffer": "^5.0.1" 1164 | } 1165 | }, 1166 | "gaxios": { 1167 | "version": "4.1.0", 1168 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.1.0.tgz", 1169 | "integrity": "sha512-vb0to8xzGnA2qcgywAjtshOKKVDf2eQhJoiL6fHhgW5tVN7wNk7egnYIO9zotfn3lQ3De1VPdf7V5/BWfCtCmg==", 1170 | "requires": { 1171 | "abort-controller": "^3.0.0", 1172 | "extend": "^3.0.2", 1173 | "https-proxy-agent": "^5.0.0", 1174 | "is-stream": "^2.0.0", 1175 | "node-fetch": "^2.3.0" 1176 | } 1177 | }, 1178 | "google-p12-pem": { 1179 | "version": "3.0.3", 1180 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", 1181 | "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==", 1182 | "requires": { 1183 | "node-forge": "^0.10.0" 1184 | } 1185 | }, 1186 | "gtoken": { 1187 | "version": "5.1.0", 1188 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.1.0.tgz", 1189 | "integrity": "sha512-4d8N6Lk8TEAHl9vVoRVMh9BNOKWVgl2DdNtr3428O75r3QFrF/a5MMu851VmK0AA8+iSvbwRv69k5XnMLURGhg==", 1190 | "requires": { 1191 | "gaxios": "^4.0.0", 1192 | "google-p12-pem": "^3.0.3", 1193 | "jws": "^4.0.0", 1194 | "mime": "^2.2.0" 1195 | } 1196 | }, 1197 | "https-proxy-agent": { 1198 | "version": "5.0.0", 1199 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 1200 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 1201 | "requires": { 1202 | "agent-base": "6", 1203 | "debug": "4" 1204 | } 1205 | }, 1206 | "jwa": { 1207 | "version": "2.0.0", 1208 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 1209 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 1210 | "requires": { 1211 | "buffer-equal-constant-time": "1.0.1", 1212 | "ecdsa-sig-formatter": "1.0.11", 1213 | "safe-buffer": "^5.0.1" 1214 | } 1215 | }, 1216 | "jws": { 1217 | "version": "4.0.0", 1218 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 1219 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 1220 | "requires": { 1221 | "jwa": "^2.0.0", 1222 | "safe-buffer": "^5.0.1" 1223 | } 1224 | }, 1225 | "ms": { 1226 | "version": "2.1.2", 1227 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1228 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1229 | }, 1230 | "node-forge": { 1231 | "version": "0.10.0", 1232 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", 1233 | "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" 1234 | } 1235 | } 1236 | }, 1237 | "google-gax": { 1238 | "version": "2.10.0", 1239 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.10.0.tgz", 1240 | "integrity": "sha512-K+1JK5ofNl5k30LsI8UQb/DeLMEbhL/SWirCx0L9pnMcApSfAjRAO7yajXT5X1vicxDBnNSwKs+cu4elxpYraw==", 1241 | "requires": { 1242 | "@grpc/grpc-js": "~1.2.0", 1243 | "@grpc/proto-loader": "^0.5.1", 1244 | "@types/long": "^4.0.0", 1245 | "abort-controller": "^3.0.0", 1246 | "duplexify": "^4.0.0", 1247 | "fast-text-encoding": "^1.0.3", 1248 | "google-auth-library": "^6.1.3", 1249 | "is-stream-ended": "^0.1.4", 1250 | "node-fetch": "^2.6.1", 1251 | "protobufjs": "^6.10.2", 1252 | "retry-request": "^4.0.0" 1253 | }, 1254 | "dependencies": { 1255 | "@types/long": { 1256 | "version": "4.0.1", 1257 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 1258 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 1259 | }, 1260 | "@types/node": { 1261 | "version": "13.13.39", 1262 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.39.tgz", 1263 | "integrity": "sha512-wct+WgRTTkBm2R3vbrFOqyZM5w0g+D8KnhstG9463CJBVC3UVZHMToge7iMBR1vDl/I+NWFHUeK9X+JcF0rWKw==" 1264 | }, 1265 | "abort-controller": { 1266 | "version": "3.0.0", 1267 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 1268 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 1269 | "requires": { 1270 | "event-target-shim": "^5.0.0" 1271 | } 1272 | }, 1273 | "duplexify": { 1274 | "version": "4.1.1", 1275 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", 1276 | "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", 1277 | "requires": { 1278 | "end-of-stream": "^1.4.1", 1279 | "inherits": "^2.0.3", 1280 | "readable-stream": "^3.1.1", 1281 | "stream-shift": "^1.0.0" 1282 | } 1283 | }, 1284 | "protobufjs": { 1285 | "version": "6.10.2", 1286 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", 1287 | "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", 1288 | "requires": { 1289 | "@protobufjs/aspromise": "^1.1.2", 1290 | "@protobufjs/base64": "^1.1.2", 1291 | "@protobufjs/codegen": "^2.0.4", 1292 | "@protobufjs/eventemitter": "^1.1.0", 1293 | "@protobufjs/fetch": "^1.1.0", 1294 | "@protobufjs/float": "^1.0.2", 1295 | "@protobufjs/inquire": "^1.1.0", 1296 | "@protobufjs/path": "^1.1.2", 1297 | "@protobufjs/pool": "^1.1.0", 1298 | "@protobufjs/utf8": "^1.1.0", 1299 | "@types/long": "^4.0.1", 1300 | "@types/node": "^13.7.0", 1301 | "long": "^4.0.0" 1302 | } 1303 | }, 1304 | "readable-stream": { 1305 | "version": "3.6.0", 1306 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1307 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1308 | "requires": { 1309 | "inherits": "^2.0.3", 1310 | "string_decoder": "^1.1.1", 1311 | "util-deprecate": "^1.0.1" 1312 | } 1313 | } 1314 | } 1315 | }, 1316 | "google-p12-pem": { 1317 | "version": "1.0.2", 1318 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", 1319 | "integrity": "sha1-yKOENQQBIoOg2//HQwt8dT7NSwc=", 1320 | "requires": { 1321 | "node-forge": "^0.7.4", 1322 | "pify": "^3.0.0" 1323 | } 1324 | }, 1325 | "grpc": { 1326 | "version": "1.24.9", 1327 | "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.9.tgz", 1328 | "integrity": "sha512-BOq1AJocZJcG/6qyX3LX2KvKy91RIix10GFLhqWg+1L6b73uWIN2w0cq+lSi0q9mXfkjeFaBz83+oau7oJqG3Q==", 1329 | "requires": { 1330 | "@mapbox/node-pre-gyp": "^1.0.4", 1331 | "@types/bytebuffer": "^5.0.40", 1332 | "lodash.camelcase": "^4.3.0", 1333 | "lodash.clone": "^4.5.0", 1334 | "nan": "^2.13.2", 1335 | "protobufjs": "^5.0.3" 1336 | }, 1337 | "dependencies": { 1338 | "protobufjs": { 1339 | "version": "5.0.3", 1340 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", 1341 | "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", 1342 | "requires": { 1343 | "ascli": "~1", 1344 | "bytebuffer": "~5", 1345 | "glob": "^7.0.5", 1346 | "yargs": "^3.10.0" 1347 | } 1348 | } 1349 | } 1350 | }, 1351 | "gtoken": { 1352 | "version": "2.3.3", 1353 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz", 1354 | "integrity": "sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==", 1355 | "requires": { 1356 | "gaxios": "^1.0.4", 1357 | "google-p12-pem": "^1.0.0", 1358 | "jws": "^3.1.5", 1359 | "mime": "^2.2.0", 1360 | "pify": "^4.0.0" 1361 | }, 1362 | "dependencies": { 1363 | "pify": { 1364 | "version": "4.0.1", 1365 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 1366 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" 1367 | } 1368 | } 1369 | }, 1370 | "har-schema": { 1371 | "version": "2.0.0", 1372 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1373 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 1374 | }, 1375 | "har-validator": { 1376 | "version": "5.1.3", 1377 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 1378 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 1379 | "requires": { 1380 | "ajv": "^6.5.5", 1381 | "har-schema": "^2.0.0" 1382 | } 1383 | }, 1384 | "has-unicode": { 1385 | "version": "2.0.1", 1386 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 1387 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 1388 | }, 1389 | "http-signature": { 1390 | "version": "1.2.0", 1391 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1392 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1393 | "requires": { 1394 | "assert-plus": "^1.0.0", 1395 | "jsprim": "^1.2.2", 1396 | "sshpk": "^1.7.0" 1397 | } 1398 | }, 1399 | "https-proxy-agent": { 1400 | "version": "2.2.4", 1401 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 1402 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 1403 | "requires": { 1404 | "agent-base": "^4.3.0", 1405 | "debug": "^3.1.0" 1406 | }, 1407 | "dependencies": { 1408 | "agent-base": { 1409 | "version": "4.3.0", 1410 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 1411 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 1412 | "requires": { 1413 | "es6-promisify": "^5.0.0" 1414 | } 1415 | } 1416 | } 1417 | }, 1418 | "inflight": { 1419 | "version": "1.0.6", 1420 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1421 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1422 | "requires": { 1423 | "once": "^1.3.0", 1424 | "wrappy": "1" 1425 | } 1426 | }, 1427 | "inherits": { 1428 | "version": "2.0.3", 1429 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1430 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1431 | }, 1432 | "ini": { 1433 | "version": "1.3.8", 1434 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1435 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 1436 | }, 1437 | "invert-kv": { 1438 | "version": "1.0.0", 1439 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 1440 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 1441 | }, 1442 | "is": { 1443 | "version": "3.2.1", 1444 | "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", 1445 | "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" 1446 | }, 1447 | "is-arrayish": { 1448 | "version": "0.3.2", 1449 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 1450 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 1451 | }, 1452 | "is-fullwidth-code-point": { 1453 | "version": "1.0.0", 1454 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1455 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1456 | "requires": { 1457 | "number-is-nan": "^1.0.0" 1458 | } 1459 | }, 1460 | "is-stream": { 1461 | "version": "2.0.0", 1462 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 1463 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" 1464 | }, 1465 | "is-stream-ended": { 1466 | "version": "0.1.4", 1467 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", 1468 | "integrity": "sha1-9QIk6V4GvODjVtRApIJ801smfto=" 1469 | }, 1470 | "is-typedarray": { 1471 | "version": "1.0.0", 1472 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1473 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1474 | }, 1475 | "isarray": { 1476 | "version": "1.0.0", 1477 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1478 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1479 | }, 1480 | "isstream": { 1481 | "version": "0.1.2", 1482 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1483 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1484 | }, 1485 | "jsbn": { 1486 | "version": "0.1.1", 1487 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1488 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 1489 | }, 1490 | "json-bigint": { 1491 | "version": "1.0.0", 1492 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", 1493 | "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", 1494 | "requires": { 1495 | "bignumber.js": "^9.0.0" 1496 | }, 1497 | "dependencies": { 1498 | "bignumber.js": { 1499 | "version": "9.0.1", 1500 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", 1501 | "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" 1502 | } 1503 | } 1504 | }, 1505 | "json-schema": { 1506 | "version": "0.2.3", 1507 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1508 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1509 | }, 1510 | "json-schema-traverse": { 1511 | "version": "0.4.1", 1512 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1513 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1514 | }, 1515 | "json-stringify-safe": { 1516 | "version": "5.0.1", 1517 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1518 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1519 | }, 1520 | "jsprim": { 1521 | "version": "1.4.1", 1522 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1523 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1524 | "requires": { 1525 | "assert-plus": "1.0.0", 1526 | "extsprintf": "1.3.0", 1527 | "json-schema": "0.2.3", 1528 | "verror": "1.10.0" 1529 | } 1530 | }, 1531 | "jwa": { 1532 | "version": "1.1.6", 1533 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", 1534 | "integrity": "sha1-hyQOdsmAjb3hh4PPImTvSSnuUOY=", 1535 | "requires": { 1536 | "buffer-equal-constant-time": "1.0.1", 1537 | "ecdsa-sig-formatter": "1.0.10", 1538 | "safe-buffer": "^5.0.1" 1539 | } 1540 | }, 1541 | "jws": { 1542 | "version": "3.1.5", 1543 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", 1544 | "integrity": "sha1-gNEtBbKT0ehB58uLTmnlYa3Pg08=", 1545 | "requires": { 1546 | "jwa": "^1.1.5", 1547 | "safe-buffer": "^5.0.1" 1548 | } 1549 | }, 1550 | "lcid": { 1551 | "version": "1.0.0", 1552 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 1553 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 1554 | "requires": { 1555 | "invert-kv": "^1.0.0" 1556 | } 1557 | }, 1558 | "lodash": { 1559 | "version": "4.17.21", 1560 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1561 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1562 | }, 1563 | "lodash.camelcase": { 1564 | "version": "4.3.0", 1565 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 1566 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 1567 | }, 1568 | "lodash.clone": { 1569 | "version": "4.5.0", 1570 | "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", 1571 | "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" 1572 | }, 1573 | "lodash.merge": { 1574 | "version": "4.6.2", 1575 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1576 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" 1577 | }, 1578 | "lodash.snakecase": { 1579 | "version": "4.1.1", 1580 | "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", 1581 | "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" 1582 | }, 1583 | "long": { 1584 | "version": "4.0.0", 1585 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1586 | "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=" 1587 | }, 1588 | "lru-cache": { 1589 | "version": "6.0.0", 1590 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1591 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1592 | "requires": { 1593 | "yallist": "^4.0.0" 1594 | }, 1595 | "dependencies": { 1596 | "yallist": { 1597 | "version": "4.0.0", 1598 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1599 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1600 | } 1601 | } 1602 | }, 1603 | "make-dir": { 1604 | "version": "3.1.0", 1605 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1606 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1607 | "requires": { 1608 | "semver": "^6.0.0" 1609 | }, 1610 | "dependencies": { 1611 | "semver": { 1612 | "version": "6.3.0", 1613 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1614 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1615 | } 1616 | } 1617 | }, 1618 | "mime": { 1619 | "version": "2.3.1", 1620 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", 1621 | "integrity": "sha1-sWIcVNY7l8R9PP5/chX31kUXw2k=" 1622 | }, 1623 | "mime-db": { 1624 | "version": "1.40.0", 1625 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 1626 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 1627 | }, 1628 | "mime-types": { 1629 | "version": "2.1.24", 1630 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 1631 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 1632 | "requires": { 1633 | "mime-db": "1.40.0" 1634 | } 1635 | }, 1636 | "mimic-response": { 1637 | "version": "1.0.1", 1638 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 1639 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 1640 | }, 1641 | "minimatch": { 1642 | "version": "3.0.4", 1643 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1644 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1645 | "requires": { 1646 | "brace-expansion": "^1.1.7" 1647 | } 1648 | }, 1649 | "minimist": { 1650 | "version": "1.2.5", 1651 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1652 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1653 | }, 1654 | "minipass": { 1655 | "version": "2.9.0", 1656 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 1657 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 1658 | "requires": { 1659 | "safe-buffer": "^5.1.2", 1660 | "yallist": "^3.0.0" 1661 | } 1662 | }, 1663 | "minizlib": { 1664 | "version": "1.3.3", 1665 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 1666 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 1667 | "requires": { 1668 | "minipass": "^2.9.0" 1669 | } 1670 | }, 1671 | "mkdirp": { 1672 | "version": "0.5.5", 1673 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1674 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1675 | "requires": { 1676 | "minimist": "^1.2.5" 1677 | } 1678 | }, 1679 | "ms": { 1680 | "version": "2.0.0", 1681 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1682 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1683 | }, 1684 | "nan": { 1685 | "version": "2.14.2", 1686 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", 1687 | "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" 1688 | }, 1689 | "node-abi": { 1690 | "version": "2.9.0", 1691 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.9.0.tgz", 1692 | "integrity": "sha512-jmEOvv0eanWjhX8dX1pmjb7oJl1U1oR4FOh0b2GnvALwSYoOdU7sj+kLDSAyjo4pfC9aj/IxkloxdLJQhSSQBA==", 1693 | "requires": { 1694 | "semver": "^5.4.1" 1695 | } 1696 | }, 1697 | "node-fetch": { 1698 | "version": "2.6.1", 1699 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 1700 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 1701 | }, 1702 | "node-forge": { 1703 | "version": "0.7.5", 1704 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", 1705 | "integrity": "sha1-bBUsNFzhHFL0ZcKr2VfoY5zWdN8=" 1706 | }, 1707 | "noop-logger": { 1708 | "version": "0.1.1", 1709 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 1710 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" 1711 | }, 1712 | "nopt": { 1713 | "version": "5.0.0", 1714 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 1715 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 1716 | "requires": { 1717 | "abbrev": "1" 1718 | } 1719 | }, 1720 | "npmlog": { 1721 | "version": "4.1.2", 1722 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 1723 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 1724 | "requires": { 1725 | "are-we-there-yet": "~1.1.2", 1726 | "console-control-strings": "~1.1.0", 1727 | "gauge": "~2.7.3", 1728 | "set-blocking": "~2.0.0" 1729 | } 1730 | }, 1731 | "number-is-nan": { 1732 | "version": "1.0.1", 1733 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1734 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1735 | }, 1736 | "oauth-sign": { 1737 | "version": "0.9.0", 1738 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1739 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1740 | }, 1741 | "object-assign": { 1742 | "version": "4.1.1", 1743 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1744 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1745 | }, 1746 | "once": { 1747 | "version": "1.4.0", 1748 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1749 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1750 | "requires": { 1751 | "wrappy": "1" 1752 | } 1753 | }, 1754 | "optjs": { 1755 | "version": "3.2.2", 1756 | "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", 1757 | "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" 1758 | }, 1759 | "os-homedir": { 1760 | "version": "1.0.2", 1761 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1762 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 1763 | }, 1764 | "os-locale": { 1765 | "version": "1.4.0", 1766 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 1767 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 1768 | "requires": { 1769 | "lcid": "^1.0.0" 1770 | } 1771 | }, 1772 | "p-defer": { 1773 | "version": "3.0.0", 1774 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", 1775 | "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" 1776 | }, 1777 | "p-finally": { 1778 | "version": "1.0.0", 1779 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1780 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 1781 | }, 1782 | "p-retry": { 1783 | "version": "3.0.1", 1784 | "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", 1785 | "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", 1786 | "requires": { 1787 | "retry": "^0.12.0" 1788 | } 1789 | }, 1790 | "p-timeout": { 1791 | "version": "3.1.0", 1792 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.1.0.tgz", 1793 | "integrity": "sha512-C27DYI+tCroT8J8cTEyySGydl2B7FlxrGNF5/wmMbl1V+jeehUCzEE/BVgzRebdm2K3ZitKOKx8YbdFumDyYmw==", 1794 | "requires": { 1795 | "p-finally": "^1.0.0" 1796 | } 1797 | }, 1798 | "path-is-absolute": { 1799 | "version": "1.0.1", 1800 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1801 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1802 | }, 1803 | "performance-now": { 1804 | "version": "2.1.0", 1805 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1806 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1807 | }, 1808 | "pify": { 1809 | "version": "3.0.0", 1810 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1811 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 1812 | }, 1813 | "prebuild-install": { 1814 | "version": "4.0.0", 1815 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-4.0.0.tgz", 1816 | "integrity": "sha512-7tayxeYboJX0RbVzdnKyGl2vhQRWr6qfClEXDhOkXjuaOKCw2q8aiuFhONRYVsG/czia7KhpykIlI2S2VaPunA==", 1817 | "requires": { 1818 | "detect-libc": "^1.0.3", 1819 | "expand-template": "^1.0.2", 1820 | "github-from-package": "0.0.0", 1821 | "minimist": "^1.2.0", 1822 | "mkdirp": "^0.5.1", 1823 | "node-abi": "^2.2.0", 1824 | "noop-logger": "^0.1.1", 1825 | "npmlog": "^4.0.1", 1826 | "os-homedir": "^1.0.1", 1827 | "pump": "^2.0.1", 1828 | "rc": "^1.1.6", 1829 | "simple-get": "^2.7.0", 1830 | "tar-fs": "^1.13.0", 1831 | "tunnel-agent": "^0.6.0", 1832 | "which-pm-runs": "^1.0.0" 1833 | } 1834 | }, 1835 | "process-nextick-args": { 1836 | "version": "2.0.0", 1837 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1838 | "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=" 1839 | }, 1840 | "protobufjs": { 1841 | "version": "6.8.6", 1842 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", 1843 | "integrity": "sha1-zjz0//liW2KWbEVfxMFeQzGhHKI=", 1844 | "requires": { 1845 | "@protobufjs/aspromise": "^1.1.2", 1846 | "@protobufjs/base64": "^1.1.2", 1847 | "@protobufjs/codegen": "^2.0.4", 1848 | "@protobufjs/eventemitter": "^1.1.0", 1849 | "@protobufjs/fetch": "^1.1.0", 1850 | "@protobufjs/float": "^1.0.2", 1851 | "@protobufjs/inquire": "^1.1.0", 1852 | "@protobufjs/path": "^1.1.2", 1853 | "@protobufjs/pool": "^1.1.0", 1854 | "@protobufjs/utf8": "^1.1.0", 1855 | "@types/long": "^3.0.32", 1856 | "@types/node": "^8.9.4", 1857 | "long": "^4.0.0" 1858 | } 1859 | }, 1860 | "psl": { 1861 | "version": "1.2.0", 1862 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", 1863 | "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==" 1864 | }, 1865 | "pump": { 1866 | "version": "2.0.1", 1867 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 1868 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 1869 | "requires": { 1870 | "end-of-stream": "^1.1.0", 1871 | "once": "^1.3.1" 1872 | } 1873 | }, 1874 | "punycode": { 1875 | "version": "2.1.1", 1876 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1877 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1878 | }, 1879 | "q": { 1880 | "version": "1.5.1", 1881 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1882 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" 1883 | }, 1884 | "qs": { 1885 | "version": "6.5.2", 1886 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1887 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1888 | }, 1889 | "rc": { 1890 | "version": "1.2.8", 1891 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1892 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1893 | "requires": { 1894 | "deep-extend": "^0.6.0", 1895 | "ini": "~1.3.0", 1896 | "minimist": "^1.2.0", 1897 | "strip-json-comments": "~2.0.1" 1898 | } 1899 | }, 1900 | "readable-stream": { 1901 | "version": "2.3.6", 1902 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1903 | "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", 1904 | "requires": { 1905 | "core-util-is": "~1.0.0", 1906 | "inherits": "~2.0.3", 1907 | "isarray": "~1.0.0", 1908 | "process-nextick-args": "~2.0.0", 1909 | "safe-buffer": "~5.1.1", 1910 | "string_decoder": "~1.1.1", 1911 | "util-deprecate": "~1.0.1" 1912 | } 1913 | }, 1914 | "request": { 1915 | "version": "2.88.0", 1916 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 1917 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 1918 | "requires": { 1919 | "aws-sign2": "~0.7.0", 1920 | "aws4": "^1.8.0", 1921 | "caseless": "~0.12.0", 1922 | "combined-stream": "~1.0.6", 1923 | "extend": "~3.0.2", 1924 | "forever-agent": "~0.6.1", 1925 | "form-data": "~2.3.2", 1926 | "har-validator": "~5.1.0", 1927 | "http-signature": "~1.2.0", 1928 | "is-typedarray": "~1.0.0", 1929 | "isstream": "~0.1.2", 1930 | "json-stringify-safe": "~5.0.1", 1931 | "mime-types": "~2.1.19", 1932 | "oauth-sign": "~0.9.0", 1933 | "performance-now": "^2.1.0", 1934 | "qs": "~6.5.2", 1935 | "safe-buffer": "^5.1.2", 1936 | "tough-cookie": "~2.4.3", 1937 | "tunnel-agent": "^0.6.0", 1938 | "uuid": "^3.3.2" 1939 | } 1940 | }, 1941 | "request-promise-core": { 1942 | "version": "1.1.2", 1943 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", 1944 | "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", 1945 | "requires": { 1946 | "lodash": "^4.17.11" 1947 | } 1948 | }, 1949 | "request-promise-native": { 1950 | "version": "1.0.7", 1951 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", 1952 | "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", 1953 | "requires": { 1954 | "request-promise-core": "1.1.2", 1955 | "stealthy-require": "^1.1.1", 1956 | "tough-cookie": "^2.3.3" 1957 | } 1958 | }, 1959 | "retry": { 1960 | "version": "0.12.0", 1961 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1962 | "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" 1963 | }, 1964 | "retry-request": { 1965 | "version": "4.1.3", 1966 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.3.tgz", 1967 | "integrity": "sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ==", 1968 | "requires": { 1969 | "debug": "^4.1.1" 1970 | }, 1971 | "dependencies": { 1972 | "debug": { 1973 | "version": "4.3.1", 1974 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1975 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1976 | "requires": { 1977 | "ms": "2.1.2" 1978 | } 1979 | }, 1980 | "ms": { 1981 | "version": "2.1.2", 1982 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1983 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1984 | } 1985 | } 1986 | }, 1987 | "rimraf": { 1988 | "version": "3.0.2", 1989 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1990 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1991 | "requires": { 1992 | "glob": "^7.1.3" 1993 | } 1994 | }, 1995 | "safe-buffer": { 1996 | "version": "5.1.2", 1997 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1998 | "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" 1999 | }, 2000 | "safer-buffer": { 2001 | "version": "2.1.2", 2002 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2003 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2004 | }, 2005 | "semver": { 2006 | "version": "5.5.0", 2007 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 2008 | "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=" 2009 | }, 2010 | "set-blocking": { 2011 | "version": "2.0.0", 2012 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2013 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 2014 | }, 2015 | "sharp": { 2016 | "version": "0.20.8", 2017 | "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.20.8.tgz", 2018 | "integrity": "sha512-A8NaPGWRDKpmHTi8sl2xzozYXhTQWBb/GaJ8ZPU7L/vKW8wVvd4Yq+isJ0c7p9sX5gnjPQcM3eOfHuvvnZ2fOQ==", 2019 | "requires": { 2020 | "color": "^3.0.0", 2021 | "detect-libc": "^1.0.3", 2022 | "fs-copy-file-sync": "^1.1.1", 2023 | "nan": "^2.11.0", 2024 | "npmlog": "^4.1.2", 2025 | "prebuild-install": "^4.0.0", 2026 | "semver": "^5.5.1", 2027 | "simple-get": "^2.8.1", 2028 | "tar": "^4.4.6", 2029 | "tunnel-agent": "^0.6.0" 2030 | }, 2031 | "dependencies": { 2032 | "chownr": { 2033 | "version": "1.1.4", 2034 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 2035 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 2036 | }, 2037 | "nan": { 2038 | "version": "2.14.0", 2039 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 2040 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" 2041 | }, 2042 | "safe-buffer": { 2043 | "version": "5.2.1", 2044 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2045 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2046 | }, 2047 | "semver": { 2048 | "version": "5.7.0", 2049 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 2050 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 2051 | }, 2052 | "tar": { 2053 | "version": "4.4.19", 2054 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", 2055 | "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", 2056 | "requires": { 2057 | "chownr": "^1.1.4", 2058 | "fs-minipass": "^1.2.7", 2059 | "minipass": "^2.9.0", 2060 | "minizlib": "^1.3.3", 2061 | "mkdirp": "^0.5.5", 2062 | "safe-buffer": "^5.2.1", 2063 | "yallist": "^3.1.1" 2064 | } 2065 | }, 2066 | "yallist": { 2067 | "version": "3.1.1", 2068 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 2069 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 2070 | } 2071 | } 2072 | }, 2073 | "signal-exit": { 2074 | "version": "3.0.2", 2075 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2076 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 2077 | }, 2078 | "simple-concat": { 2079 | "version": "1.0.0", 2080 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 2081 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 2082 | }, 2083 | "simple-get": { 2084 | "version": "2.8.1", 2085 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", 2086 | "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", 2087 | "requires": { 2088 | "decompress-response": "^3.3.0", 2089 | "once": "^1.3.1", 2090 | "simple-concat": "^1.0.0" 2091 | } 2092 | }, 2093 | "simple-swizzle": { 2094 | "version": "0.2.2", 2095 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 2096 | "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", 2097 | "requires": { 2098 | "is-arrayish": "^0.3.1" 2099 | } 2100 | }, 2101 | "sshpk": { 2102 | "version": "1.16.1", 2103 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 2104 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 2105 | "requires": { 2106 | "asn1": "~0.2.3", 2107 | "assert-plus": "^1.0.0", 2108 | "bcrypt-pbkdf": "^1.0.0", 2109 | "dashdash": "^1.12.0", 2110 | "ecc-jsbn": "~0.1.1", 2111 | "getpass": "^0.1.1", 2112 | "jsbn": "~0.1.0", 2113 | "safer-buffer": "^2.0.2", 2114 | "tweetnacl": "~0.14.0" 2115 | } 2116 | }, 2117 | "stealthy-require": { 2118 | "version": "1.1.1", 2119 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 2120 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 2121 | }, 2122 | "stream-shift": { 2123 | "version": "1.0.0", 2124 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 2125 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" 2126 | }, 2127 | "string-width": { 2128 | "version": "1.0.2", 2129 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2130 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2131 | "requires": { 2132 | "code-point-at": "^1.0.0", 2133 | "is-fullwidth-code-point": "^1.0.0", 2134 | "strip-ansi": "^3.0.0" 2135 | } 2136 | }, 2137 | "string_decoder": { 2138 | "version": "1.1.1", 2139 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2140 | "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", 2141 | "requires": { 2142 | "safe-buffer": "~5.1.0" 2143 | } 2144 | }, 2145 | "strip-ansi": { 2146 | "version": "3.0.1", 2147 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2148 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2149 | "requires": { 2150 | "ansi-regex": "^2.0.0" 2151 | } 2152 | }, 2153 | "strip-json-comments": { 2154 | "version": "2.0.1", 2155 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2156 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 2157 | }, 2158 | "tar": { 2159 | "version": "6.1.11", 2160 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", 2161 | "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", 2162 | "requires": { 2163 | "chownr": "^2.0.0", 2164 | "fs-minipass": "^2.0.0", 2165 | "minipass": "^3.0.0", 2166 | "minizlib": "^2.1.1", 2167 | "mkdirp": "^1.0.3", 2168 | "yallist": "^4.0.0" 2169 | }, 2170 | "dependencies": { 2171 | "chownr": { 2172 | "version": "2.0.0", 2173 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 2174 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" 2175 | }, 2176 | "fs-minipass": { 2177 | "version": "2.1.0", 2178 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 2179 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 2180 | "requires": { 2181 | "minipass": "^3.0.0" 2182 | } 2183 | }, 2184 | "minipass": { 2185 | "version": "3.1.3", 2186 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", 2187 | "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", 2188 | "requires": { 2189 | "yallist": "^4.0.0" 2190 | } 2191 | }, 2192 | "minizlib": { 2193 | "version": "2.1.2", 2194 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 2195 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 2196 | "requires": { 2197 | "minipass": "^3.0.0", 2198 | "yallist": "^4.0.0" 2199 | } 2200 | }, 2201 | "mkdirp": { 2202 | "version": "1.0.4", 2203 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 2204 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 2205 | }, 2206 | "yallist": { 2207 | "version": "4.0.0", 2208 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2209 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 2210 | } 2211 | } 2212 | }, 2213 | "tar-fs": { 2214 | "version": "1.16.3", 2215 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", 2216 | "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", 2217 | "requires": { 2218 | "chownr": "^1.0.1", 2219 | "mkdirp": "^0.5.1", 2220 | "pump": "^1.0.0", 2221 | "tar-stream": "^1.1.2" 2222 | }, 2223 | "dependencies": { 2224 | "pump": { 2225 | "version": "1.0.3", 2226 | "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", 2227 | "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", 2228 | "requires": { 2229 | "end-of-stream": "^1.1.0", 2230 | "once": "^1.3.1" 2231 | } 2232 | } 2233 | } 2234 | }, 2235 | "tar-stream": { 2236 | "version": "1.6.2", 2237 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 2238 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 2239 | "requires": { 2240 | "bl": "^1.0.0", 2241 | "buffer-alloc": "^1.2.0", 2242 | "end-of-stream": "^1.0.0", 2243 | "fs-constants": "^1.0.0", 2244 | "readable-stream": "^2.3.0", 2245 | "to-buffer": "^1.1.1", 2246 | "xtend": "^4.0.0" 2247 | } 2248 | }, 2249 | "to-buffer": { 2250 | "version": "1.1.1", 2251 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 2252 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" 2253 | }, 2254 | "tough-cookie": { 2255 | "version": "2.4.3", 2256 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 2257 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 2258 | "requires": { 2259 | "psl": "^1.1.24", 2260 | "punycode": "^1.4.1" 2261 | }, 2262 | "dependencies": { 2263 | "punycode": { 2264 | "version": "1.4.1", 2265 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2266 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 2267 | } 2268 | } 2269 | }, 2270 | "tunnel-agent": { 2271 | "version": "0.6.0", 2272 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2273 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2274 | "requires": { 2275 | "safe-buffer": "^5.0.1" 2276 | } 2277 | }, 2278 | "tweetnacl": { 2279 | "version": "0.14.5", 2280 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2281 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 2282 | }, 2283 | "uri-js": { 2284 | "version": "4.2.2", 2285 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 2286 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 2287 | "requires": { 2288 | "punycode": "^2.1.0" 2289 | } 2290 | }, 2291 | "util-deprecate": { 2292 | "version": "1.0.2", 2293 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2294 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2295 | }, 2296 | "uuid": { 2297 | "version": "3.3.2", 2298 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 2299 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 2300 | }, 2301 | "verror": { 2302 | "version": "1.10.0", 2303 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2304 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2305 | "requires": { 2306 | "assert-plus": "^1.0.0", 2307 | "core-util-is": "1.0.2", 2308 | "extsprintf": "^1.2.0" 2309 | } 2310 | }, 2311 | "which-pm-runs": { 2312 | "version": "1.0.0", 2313 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 2314 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" 2315 | }, 2316 | "wide-align": { 2317 | "version": "1.1.3", 2318 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 2319 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 2320 | "requires": { 2321 | "string-width": "^1.0.2 || 2" 2322 | } 2323 | }, 2324 | "window-size": { 2325 | "version": "0.1.4", 2326 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 2327 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" 2328 | }, 2329 | "wrap-ansi": { 2330 | "version": "2.1.0", 2331 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 2332 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 2333 | "requires": { 2334 | "string-width": "^1.0.1", 2335 | "strip-ansi": "^3.0.1" 2336 | } 2337 | }, 2338 | "wrappy": { 2339 | "version": "1.0.2", 2340 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2341 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2342 | }, 2343 | "xtend": { 2344 | "version": "4.0.1", 2345 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2346 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 2347 | }, 2348 | "y18n": { 2349 | "version": "3.2.2", 2350 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", 2351 | "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" 2352 | }, 2353 | "yallist": { 2354 | "version": "3.0.2", 2355 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", 2356 | "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" 2357 | }, 2358 | "yargs": { 2359 | "version": "3.32.0", 2360 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", 2361 | "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 2362 | "requires": { 2363 | "camelcase": "^2.0.1", 2364 | "cliui": "^3.0.3", 2365 | "decamelize": "^1.1.1", 2366 | "os-locale": "^1.4.0", 2367 | "string-width": "^1.0.1", 2368 | "window-size": "^0.1.4", 2369 | "y18n": "^3.2.0" 2370 | } 2371 | } 2372 | } 2373 | } 2374 | -------------------------------------------------------------------------------- /imager/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daily-imager", 3 | "main": "index.js", 4 | "private": true, 5 | "scripts": { 6 | "deploy": "gcloud --project devkit-prod beta functions deploy imager --runtime nodejs10 --trigger-resource post-keywords-extracted --trigger-event google.pubsub.topic.publish --env-vars-file .env.yaml --timeout 120" 7 | }, 8 | "engines": { 9 | "node": "~10.15.0" 10 | }, 11 | "dependencies": { 12 | "@google-cloud/pubsub": "^2.7.0", 13 | "@google-cloud/vision": "^0.25.0", 14 | "cloudinary": "^1.14.0", 15 | "p-retry": "^3.0.1", 16 | "p-timeout": "^3.1.0", 17 | "request": "^2.88.0", 18 | "request-promise-native": "^1.0.7", 19 | "sharp": "^0.20.8" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /imager/utils.js: -------------------------------------------------------------------------------- 1 | const crypto = require('crypto'); 2 | const { PubSub } = require(`@google-cloud/pubsub`); 3 | const pubsub = new PubSub(); 4 | const topic = pubsub.topic('post-keywords-extracted'); 5 | // const topic = pubsub.topic('ad-image-processed'); 6 | 7 | const num = '1'; 8 | const link = `https://www.eventbrite.com/e/the-monthly-dev-1-by-dailydev-registration-133820993193`; 9 | const description = 'World-class talks by expert developers. Save your FREE seat today!'; 10 | const company = 'daily.dev'; 11 | const source = `The Monthly Dev`; 12 | const image = 'https://storage.googleapis.com/devkit-assets/ads/Fallback%20Ads%20%20(1).jpg'; 13 | const start = new Date('12/28/20Z'); 14 | // const end = new Date(start.getTime() + 7 * 24 * 60 * 60 * 1000); 15 | const end = new Date('12/28/25Z'); 16 | 17 | const data = { 18 | id: `TMD${num}`, 19 | link, 20 | description, 21 | company, 22 | source, 23 | image, 24 | start, 25 | end, 26 | geo: null, 27 | fallback: false, 28 | type: 'ad', 29 | }; 30 | topic.publisher().publish(Buffer.from(JSON.stringify(data))); 31 | -------------------------------------------------------------------------------- /webflow_forms/.gcloudignore: -------------------------------------------------------------------------------- 1 | # This file specifies files that are *not* uploaded to Google Cloud Platform 2 | # using gcloud. It follows the same syntax as .gitignore, with the addition of 3 | # "#!include" directives (which insert the entries of the given .gitignore-style 4 | # file at that point). 5 | # 6 | # For more information, run: 7 | # $ gcloud topic gcloudignore 8 | # 9 | .gcloudignore 10 | # If you would like to upload your .git directory, .gitignore file or files 11 | # from your .gitignore file, remove the corresponding line 12 | # below: 13 | .git 14 | .gitignore 15 | 16 | node_modules 17 | -------------------------------------------------------------------------------- /webflow_forms/index.js: -------------------------------------------------------------------------------- 1 | const client = require('@sendgrid/client'); 2 | client.setApiKey(process.env.SENDGRID_API_KEY); 3 | 4 | exports.webflow_forms = (req, res) => { 5 | if (req.method.toLowerCase() !== 'post' || req.url !== '/') { 6 | return res.status(404).send(); 7 | } 8 | 9 | const contentType = req.get('content-type'); 10 | if (!contentType || contentType.indexOf('application/json') < -1) { 11 | console.warn(`unknown content-type "${contentType}"`); 12 | return res.status(400).send(); 13 | } 14 | 15 | const body = req.body; 16 | if (body.site !== process.env.WEBFLOW_SITE) { 17 | return res.status(400).send(); 18 | } 19 | 20 | let listId; 21 | switch (body.name) { 22 | case 'Newsletter': 23 | listId = '13d39d0b-927c-4cad-8cbc-f2eaa8af4147'; 24 | break; 25 | case 'Premium': 26 | listId = 'b5bfeeec-4faf-4e38-a2d8-884ce0ad2e57'; 27 | break; 28 | default: 29 | return res.status(400).send(); 30 | } 31 | 32 | return client.request({ 33 | method: 'PUT', 34 | url: '/v3/marketing/contacts', 35 | body: { 36 | list_ids: [listId], 37 | contacts: [{ 38 | email: body.data.Email, 39 | }], 40 | }, 41 | }) 42 | .then(([contactsRes, contactsBody]) => { 43 | if (contactsRes.statusCode === 202) { 44 | console.log(`added ${body.data.Email} to ${body.name}`); 45 | return res.status(200).send('OK'); 46 | } 47 | console.error(contactsBody); 48 | return res.status(500).send(); 49 | }) 50 | .catch(() => res.status(500).send()); 51 | }; 52 | -------------------------------------------------------------------------------- /webflow_forms/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daily-webflow_forms", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@sendgrid/client": { 7 | "version": "7.4.0", 8 | "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.4.0.tgz", 9 | "integrity": "sha512-KAZlEb1P8sATgBN+7hXgzaRF94nF9KQgDxQ6zUT1BV0kEsNtJQ2cs35sCtWt6AKKJrL0xPI/MsfcAJqom4YQBg==", 10 | "requires": { 11 | "@sendgrid/helpers": "^7.4.0", 12 | "axios": "^0.19.2" 13 | } 14 | }, 15 | "@sendgrid/helpers": { 16 | "version": "7.4.0", 17 | "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-7.4.0.tgz", 18 | "integrity": "sha512-IQI2vemiJB0+X6bEp4HRG+0/wrzR2RDGnB5rwfq1CsPDrUFdJfxbE2zbGx//1GnlNwAtbHyc93ejU1m0KZr86w==", 19 | "requires": { 20 | "deepmerge": "^4.2.2" 21 | } 22 | }, 23 | "axios": { 24 | "version": "0.19.2", 25 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", 26 | "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", 27 | "requires": { 28 | "follow-redirects": "1.5.10" 29 | } 30 | }, 31 | "debug": { 32 | "version": "3.1.0", 33 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 34 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 35 | "requires": { 36 | "ms": "2.0.0" 37 | } 38 | }, 39 | "deepmerge": { 40 | "version": "4.2.2", 41 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", 42 | "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" 43 | }, 44 | "follow-redirects": { 45 | "version": "1.5.10", 46 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 47 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 48 | "requires": { 49 | "debug": "=3.1.0" 50 | } 51 | }, 52 | "ms": { 53 | "version": "2.0.0", 54 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 55 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /webflow_forms/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daily-webflow_forms", 3 | "main": "index.js", 4 | "private": true, 5 | "scripts": { 6 | "deploy": "gcloud --project devkit-prod beta functions deploy webflow_forms --runtime nodejs10 --trigger-http --env-vars-file .env.yaml" 7 | }, 8 | "engines": { 9 | "node": "~10.15.0" 10 | }, 11 | "dependencies": { 12 | "@sendgrid/client": "^7.4.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /webhook/.gcloudignore: -------------------------------------------------------------------------------- 1 | # This file specifies files that are *not* uploaded to Google Cloud Platform 2 | # using gcloud. It follows the same syntax as .gitignore, with the addition of 3 | # "#!include" directives (which insert the entries of the given .gitignore-style 4 | # file at that point). 5 | # 6 | # For more information, run: 7 | # $ gcloud topic gcloudignore 8 | # 9 | .gcloudignore 10 | # If you would like to upload your .git directory, .gitignore file or files 11 | # from your .gitignore file, remove the corresponding line 12 | # below: 13 | .git 14 | .gitignore 15 | 16 | node_modules 17 | 18 | *.csv 19 | .env.yaml 20 | -------------------------------------------------------------------------------- /webhook/index.js: -------------------------------------------------------------------------------- 1 | const crypto = require('crypto'); 2 | const { PubSub } = require(`@google-cloud/pubsub`); 3 | const pubsub = new PubSub(); 4 | const topic = pubsub.topic('post-fetched', { 5 | batching: { 6 | maxMessages: 10, 7 | maxMilliseconds: 1000, 8 | }, 9 | }); 10 | 11 | const convertTime = (epoch) => (epoch ? new Date(epoch * 1000) : null); 12 | 13 | exports.webhook = (req, res) => { 14 | const pubId = req.url.substring(1); 15 | 16 | // if (req.method.toLowerCase() === 'get') { 17 | // const parsedUrl = url.parse(req.url, true); 18 | // if (parsedUrl.query['hub.challenge']) { 19 | // console.log(`received challenge ${parsedUrl.query['hub.challenge']} for ${parsedUrl.query['hub.topic']}`); 20 | // return res.status(200).send(parsedUrl.query['hub.challenge']); 21 | // } 22 | // } 23 | 24 | if (req.method.toLowerCase() !== 'post' || !pubId.length) { 25 | return res.status(404).send(); 26 | } 27 | 28 | const contentType = req.get('content-type'); 29 | if (!contentType || contentType.indexOf('application/json') < -1) { 30 | console.warn(`unknown content-type "${contentType}"`); 31 | return res.status(400).send('unknown content-type'); 32 | } 33 | 34 | console.log(`received notification from ${pubId}`); 35 | 36 | const body = req.body; 37 | console.log(body); 38 | 39 | const hmac = crypto.createHmac('sha1', process.env.WEBHOOK_SECRET); 40 | const sig = `sha1=${hmac.update(JSON.stringify(body)).digest('hex')}`; 41 | if (req.get('x-hub-signature') !== sig) { 42 | console.warn('failed to verify hub signature'); 43 | return res.status(401).send(); 44 | } 45 | 46 | const items = body.items || []; 47 | if (items) { 48 | return Promise.resolve() 49 | .then(() => { 50 | return Promise.all(items.map((item) => ({ 51 | id: crypto.createHash('md5').update(item.id).digest('hex'), 52 | title: item.title, 53 | tags: item.categories ? item.categories.map(c => c.toLowerCase()) : [], 54 | publishedAt: convertTime(item.published), 55 | updatedAt: convertTime(item.updated), 56 | publicationId: pubId, 57 | url: item.permalinkUrl, 58 | })).map((item) => { 59 | console.log(`[${item.id}] post fetched`, item); 60 | return topic.publish(Buffer.from(JSON.stringify(item))); 61 | })); 62 | }) 63 | .then(() => res.status(200).send('OK')); 64 | } 65 | 66 | res.status(200).send('OK'); 67 | }; 68 | -------------------------------------------------------------------------------- /webhook/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daily-webhook", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@google-cloud/paginator": { 7 | "version": "3.0.5", 8 | "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.5.tgz", 9 | "integrity": "sha512-N4Uk4BT1YuskfRhKXBs0n9Lg2YTROZc6IMpkO/8DIHODtm5s3xY8K5vVBo23v/2XulY3azwITQlYWgT4GdLsUw==", 10 | "requires": { 11 | "arrify": "^2.0.0", 12 | "extend": "^3.0.2" 13 | } 14 | }, 15 | "@google-cloud/precise-date": { 16 | "version": "2.0.3", 17 | "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-2.0.3.tgz", 18 | "integrity": "sha512-+SDJ3ZvGkF7hzo6BGa8ZqeK3F6Z4+S+KviC9oOK+XCs3tfMyJCh/4j93XIWINgMMDIh9BgEvlw4306VxlXIlYA==" 19 | }, 20 | "@google-cloud/projectify": { 21 | "version": "2.0.1", 22 | "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.0.1.tgz", 23 | "integrity": "sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ==" 24 | }, 25 | "@google-cloud/promisify": { 26 | "version": "2.0.3", 27 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.3.tgz", 28 | "integrity": "sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw==" 29 | }, 30 | "@google-cloud/pubsub": { 31 | "version": "2.7.0", 32 | "resolved": "https://registry.npmjs.org/@google-cloud/pubsub/-/pubsub-2.7.0.tgz", 33 | "integrity": "sha512-wc/XOo5Ibo3GWmuaLu80EBIhXSdu2vf99HUqBbdsSSkmRNIka2HqoIhLlOFnnncQn0lZnGL7wtKGIDLoH9LiBg==", 34 | "requires": { 35 | "@google-cloud/paginator": "^3.0.0", 36 | "@google-cloud/precise-date": "^2.0.0", 37 | "@google-cloud/projectify": "^2.0.0", 38 | "@google-cloud/promisify": "^2.0.0", 39 | "@opentelemetry/api": "^0.11.0", 40 | "@opentelemetry/tracing": "^0.11.0", 41 | "@types/duplexify": "^3.6.0", 42 | "@types/long": "^4.0.0", 43 | "arrify": "^2.0.0", 44 | "extend": "^3.0.2", 45 | "google-auth-library": "^6.1.2", 46 | "google-gax": "^2.9.2", 47 | "is-stream-ended": "^0.1.4", 48 | "lodash.snakecase": "^4.1.1", 49 | "p-defer": "^3.0.0" 50 | } 51 | }, 52 | "@grpc/grpc-js": { 53 | "version": "1.2.2", 54 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.2.2.tgz", 55 | "integrity": "sha512-iK/T984Ni6VnmlQK/LJdUk+VsXSaYIWkgzJ0LyOcxN2SowAmoRjG28kS7B1ui/q/MAv42iM3051WBt5QorFxmg==", 56 | "requires": { 57 | "@types/node": "^12.12.47", 58 | "google-auth-library": "^6.1.1", 59 | "semver": "^6.2.0" 60 | }, 61 | "dependencies": { 62 | "@types/node": { 63 | "version": "12.19.12", 64 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.12.tgz", 65 | "integrity": "sha512-UwfL2uIU9arX/+/PRcIkT08/iBadGN2z6ExOROA2Dh5mAuWTBj6iJbQX4nekiV5H8cTrEG569LeX+HRco9Cbxw==" 66 | }, 67 | "semver": { 68 | "version": "6.3.0", 69 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 70 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 71 | } 72 | } 73 | }, 74 | "@grpc/proto-loader": { 75 | "version": "0.5.5", 76 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz", 77 | "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==", 78 | "requires": { 79 | "lodash.camelcase": "^4.3.0", 80 | "protobufjs": "^6.8.6" 81 | } 82 | }, 83 | "@opentelemetry/api": { 84 | "version": "0.11.0", 85 | "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.11.0.tgz", 86 | "integrity": "sha512-K+1ADLMxduhsXoZ0GRfi9Pw162FvzBQLDQlHru1lg86rpIU+4XqdJkSGo6y3Kg+GmOWq1HNHOA/ydw/rzHQkRg==", 87 | "requires": { 88 | "@opentelemetry/context-base": "^0.11.0" 89 | } 90 | }, 91 | "@opentelemetry/context-base": { 92 | "version": "0.11.0", 93 | "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.11.0.tgz", 94 | "integrity": "sha512-ESRk+572bftles7CVlugAj5Azrz61VO0MO0TS2pE9MLVL/zGmWuUBQryART6/nsrFqo+v9HPt37GPNcECTZR1w==" 95 | }, 96 | "@opentelemetry/core": { 97 | "version": "0.11.0", 98 | "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.11.0.tgz", 99 | "integrity": "sha512-ZEKjBXeDGBqzouz0uJmrbEKNExEsQOhsZ3tJDCLcz5dUNoVw642oIn2LYWdQK2YdIfZbEmltiF65/csGsaBtFA==", 100 | "requires": { 101 | "@opentelemetry/api": "^0.11.0", 102 | "@opentelemetry/context-base": "^0.11.0", 103 | "semver": "^7.1.3" 104 | } 105 | }, 106 | "@opentelemetry/resources": { 107 | "version": "0.11.0", 108 | "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.11.0.tgz", 109 | "integrity": "sha512-o7DwV1TcezqBtS5YW2AWBcn01nVpPptIbTr966PLlVBcS//w8LkjeOShiSZxQ0lmV4b2en0FiSouSDoXk/5qIQ==", 110 | "requires": { 111 | "@opentelemetry/api": "^0.11.0", 112 | "@opentelemetry/core": "^0.11.0" 113 | } 114 | }, 115 | "@opentelemetry/semantic-conventions": { 116 | "version": "0.11.0", 117 | "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.11.0.tgz", 118 | "integrity": "sha512-xsthnI/J+Cx0YVDGgUzvrH0ZTtfNtl866M454NarYwDrc0JvC24sYw+XS5PJyk2KDzAHtb0vlrumUc1OAut/Fw==" 119 | }, 120 | "@opentelemetry/tracing": { 121 | "version": "0.11.0", 122 | "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.11.0.tgz", 123 | "integrity": "sha512-QweFmxzl32BcyzwdWCNjVXZT1WeENNS/RWETq/ohqu+fAsTcMyGcr6cOq/yDdFmtBy+bm5WVVdeByEjNS+c4/w==", 124 | "requires": { 125 | "@opentelemetry/api": "^0.11.0", 126 | "@opentelemetry/context-base": "^0.11.0", 127 | "@opentelemetry/core": "^0.11.0", 128 | "@opentelemetry/resources": "^0.11.0", 129 | "@opentelemetry/semantic-conventions": "^0.11.0" 130 | } 131 | }, 132 | "@protobufjs/aspromise": { 133 | "version": "1.1.2", 134 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 135 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 136 | }, 137 | "@protobufjs/base64": { 138 | "version": "1.1.2", 139 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 140 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 141 | }, 142 | "@protobufjs/codegen": { 143 | "version": "2.0.4", 144 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 145 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 146 | }, 147 | "@protobufjs/eventemitter": { 148 | "version": "1.1.0", 149 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 150 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 151 | }, 152 | "@protobufjs/fetch": { 153 | "version": "1.1.0", 154 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 155 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 156 | "requires": { 157 | "@protobufjs/aspromise": "^1.1.1", 158 | "@protobufjs/inquire": "^1.1.0" 159 | } 160 | }, 161 | "@protobufjs/float": { 162 | "version": "1.0.2", 163 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 164 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 165 | }, 166 | "@protobufjs/inquire": { 167 | "version": "1.1.0", 168 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 169 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 170 | }, 171 | "@protobufjs/path": { 172 | "version": "1.1.2", 173 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 174 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 175 | }, 176 | "@protobufjs/pool": { 177 | "version": "1.1.0", 178 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 179 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 180 | }, 181 | "@protobufjs/utf8": { 182 | "version": "1.1.0", 183 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 184 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 185 | }, 186 | "@types/duplexify": { 187 | "version": "3.6.0", 188 | "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.0.tgz", 189 | "integrity": "sha512-5zOA53RUlzN74bvrSGwjudssD9F3a797sDZQkiYpUOxW+WHaXTCPz4/d5Dgi6FKnOqZ2CpaTo0DhgIfsXAOE/A==", 190 | "requires": { 191 | "@types/node": "*" 192 | } 193 | }, 194 | "@types/long": { 195 | "version": "4.0.1", 196 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 197 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 198 | }, 199 | "@types/node": { 200 | "version": "14.14.20", 201 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", 202 | "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==" 203 | }, 204 | "abort-controller": { 205 | "version": "3.0.0", 206 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 207 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 208 | "requires": { 209 | "event-target-shim": "^5.0.0" 210 | } 211 | }, 212 | "agent-base": { 213 | "version": "6.0.2", 214 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 215 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 216 | "requires": { 217 | "debug": "4" 218 | } 219 | }, 220 | "ajv": { 221 | "version": "6.10.1", 222 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz", 223 | "integrity": "sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ==", 224 | "dev": true, 225 | "requires": { 226 | "fast-deep-equal": "^2.0.1", 227 | "fast-json-stable-stringify": "^2.0.0", 228 | "json-schema-traverse": "^0.4.1", 229 | "uri-js": "^4.2.2" 230 | } 231 | }, 232 | "arrify": { 233 | "version": "2.0.1", 234 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 235 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" 236 | }, 237 | "asn1": { 238 | "version": "0.2.4", 239 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 240 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 241 | "dev": true, 242 | "requires": { 243 | "safer-buffer": "~2.1.0" 244 | } 245 | }, 246 | "assert-plus": { 247 | "version": "1.0.0", 248 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 249 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 250 | "dev": true 251 | }, 252 | "asynckit": { 253 | "version": "0.4.0", 254 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 255 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 256 | "dev": true 257 | }, 258 | "aws-sign2": { 259 | "version": "0.7.0", 260 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 261 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 262 | "dev": true 263 | }, 264 | "aws4": { 265 | "version": "1.8.0", 266 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 267 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 268 | "dev": true 269 | }, 270 | "base64-js": { 271 | "version": "1.5.1", 272 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 273 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 274 | }, 275 | "bcrypt-pbkdf": { 276 | "version": "1.0.2", 277 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 278 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 279 | "dev": true, 280 | "requires": { 281 | "tweetnacl": "^0.14.3" 282 | } 283 | }, 284 | "bignumber.js": { 285 | "version": "9.0.1", 286 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", 287 | "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" 288 | }, 289 | "buffer-equal-constant-time": { 290 | "version": "1.0.1", 291 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 292 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 293 | }, 294 | "caseless": { 295 | "version": "0.12.0", 296 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 297 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 298 | "dev": true 299 | }, 300 | "combined-stream": { 301 | "version": "1.0.8", 302 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 303 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 304 | "dev": true, 305 | "requires": { 306 | "delayed-stream": "~1.0.0" 307 | } 308 | }, 309 | "core-util-is": { 310 | "version": "1.0.2", 311 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 312 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 313 | "dev": true 314 | }, 315 | "dashdash": { 316 | "version": "1.14.1", 317 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 318 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 319 | "dev": true, 320 | "requires": { 321 | "assert-plus": "^1.0.0" 322 | } 323 | }, 324 | "debug": { 325 | "version": "4.3.1", 326 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 327 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 328 | "requires": { 329 | "ms": "2.1.2" 330 | } 331 | }, 332 | "delayed-stream": { 333 | "version": "1.0.0", 334 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 335 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 336 | "dev": true 337 | }, 338 | "duplexify": { 339 | "version": "4.1.1", 340 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", 341 | "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", 342 | "requires": { 343 | "end-of-stream": "^1.4.1", 344 | "inherits": "^2.0.3", 345 | "readable-stream": "^3.1.1", 346 | "stream-shift": "^1.0.0" 347 | } 348 | }, 349 | "ecc-jsbn": { 350 | "version": "0.1.2", 351 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 352 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 353 | "dev": true, 354 | "requires": { 355 | "jsbn": "~0.1.0", 356 | "safer-buffer": "^2.1.0" 357 | } 358 | }, 359 | "ecdsa-sig-formatter": { 360 | "version": "1.0.11", 361 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 362 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 363 | "requires": { 364 | "safe-buffer": "^5.0.1" 365 | } 366 | }, 367 | "end-of-stream": { 368 | "version": "1.4.4", 369 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 370 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 371 | "requires": { 372 | "once": "^1.4.0" 373 | } 374 | }, 375 | "event-target-shim": { 376 | "version": "5.0.1", 377 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 378 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 379 | }, 380 | "extend": { 381 | "version": "3.0.2", 382 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 383 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 384 | }, 385 | "extsprintf": { 386 | "version": "1.3.0", 387 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 388 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 389 | "dev": true 390 | }, 391 | "fast-deep-equal": { 392 | "version": "2.0.1", 393 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 394 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 395 | "dev": true 396 | }, 397 | "fast-json-stable-stringify": { 398 | "version": "2.0.0", 399 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 400 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 401 | "dev": true 402 | }, 403 | "fast-text-encoding": { 404 | "version": "1.0.3", 405 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", 406 | "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" 407 | }, 408 | "forever-agent": { 409 | "version": "0.6.1", 410 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 411 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 412 | "dev": true 413 | }, 414 | "form-data": { 415 | "version": "2.3.3", 416 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 417 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 418 | "dev": true, 419 | "requires": { 420 | "asynckit": "^0.4.0", 421 | "combined-stream": "^1.0.6", 422 | "mime-types": "^2.1.12" 423 | } 424 | }, 425 | "gaxios": { 426 | "version": "4.1.0", 427 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.1.0.tgz", 428 | "integrity": "sha512-vb0to8xzGnA2qcgywAjtshOKKVDf2eQhJoiL6fHhgW5tVN7wNk7egnYIO9zotfn3lQ3De1VPdf7V5/BWfCtCmg==", 429 | "requires": { 430 | "abort-controller": "^3.0.0", 431 | "extend": "^3.0.2", 432 | "https-proxy-agent": "^5.0.0", 433 | "is-stream": "^2.0.0", 434 | "node-fetch": "^2.3.0" 435 | } 436 | }, 437 | "gcp-metadata": { 438 | "version": "4.2.1", 439 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.1.tgz", 440 | "integrity": "sha512-tSk+REe5iq/N+K+SK1XjZJUrFPuDqGZVzCy2vocIHIGmPlTGsa8owXMJwGkrXr73NO0AzhPW4MF2DEHz7P2AVw==", 441 | "requires": { 442 | "gaxios": "^4.0.0", 443 | "json-bigint": "^1.0.0" 444 | } 445 | }, 446 | "getpass": { 447 | "version": "0.1.7", 448 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 449 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 450 | "dev": true, 451 | "requires": { 452 | "assert-plus": "^1.0.0" 453 | } 454 | }, 455 | "google-auth-library": { 456 | "version": "6.1.3", 457 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.3.tgz", 458 | "integrity": "sha512-m9mwvY3GWbr7ZYEbl61isWmk+fvTmOt0YNUfPOUY2VH8K5pZlAIWJjxEi0PqR3OjMretyiQLI6GURMrPSwHQ2g==", 459 | "requires": { 460 | "arrify": "^2.0.0", 461 | "base64-js": "^1.3.0", 462 | "ecdsa-sig-formatter": "^1.0.11", 463 | "fast-text-encoding": "^1.0.0", 464 | "gaxios": "^4.0.0", 465 | "gcp-metadata": "^4.2.0", 466 | "gtoken": "^5.0.4", 467 | "jws": "^4.0.0", 468 | "lru-cache": "^6.0.0" 469 | } 470 | }, 471 | "google-gax": { 472 | "version": "2.10.0", 473 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.10.0.tgz", 474 | "integrity": "sha512-K+1JK5ofNl5k30LsI8UQb/DeLMEbhL/SWirCx0L9pnMcApSfAjRAO7yajXT5X1vicxDBnNSwKs+cu4elxpYraw==", 475 | "requires": { 476 | "@grpc/grpc-js": "~1.2.0", 477 | "@grpc/proto-loader": "^0.5.1", 478 | "@types/long": "^4.0.0", 479 | "abort-controller": "^3.0.0", 480 | "duplexify": "^4.0.0", 481 | "fast-text-encoding": "^1.0.3", 482 | "google-auth-library": "^6.1.3", 483 | "is-stream-ended": "^0.1.4", 484 | "node-fetch": "^2.6.1", 485 | "protobufjs": "^6.10.2", 486 | "retry-request": "^4.0.0" 487 | } 488 | }, 489 | "google-p12-pem": { 490 | "version": "3.0.3", 491 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", 492 | "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==", 493 | "requires": { 494 | "node-forge": "^0.10.0" 495 | } 496 | }, 497 | "gtoken": { 498 | "version": "5.1.0", 499 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.1.0.tgz", 500 | "integrity": "sha512-4d8N6Lk8TEAHl9vVoRVMh9BNOKWVgl2DdNtr3428O75r3QFrF/a5MMu851VmK0AA8+iSvbwRv69k5XnMLURGhg==", 501 | "requires": { 502 | "gaxios": "^4.0.0", 503 | "google-p12-pem": "^3.0.3", 504 | "jws": "^4.0.0", 505 | "mime": "^2.2.0" 506 | } 507 | }, 508 | "har-schema": { 509 | "version": "2.0.0", 510 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 511 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 512 | "dev": true 513 | }, 514 | "har-validator": { 515 | "version": "5.1.3", 516 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 517 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 518 | "dev": true, 519 | "requires": { 520 | "ajv": "^6.5.5", 521 | "har-schema": "^2.0.0" 522 | } 523 | }, 524 | "http-signature": { 525 | "version": "1.2.0", 526 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 527 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 528 | "dev": true, 529 | "requires": { 530 | "assert-plus": "^1.0.0", 531 | "jsprim": "^1.2.2", 532 | "sshpk": "^1.7.0" 533 | } 534 | }, 535 | "https-proxy-agent": { 536 | "version": "5.0.0", 537 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 538 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 539 | "requires": { 540 | "agent-base": "6", 541 | "debug": "4" 542 | } 543 | }, 544 | "inherits": { 545 | "version": "2.0.4", 546 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 547 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 548 | }, 549 | "is-stream": { 550 | "version": "2.0.0", 551 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 552 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" 553 | }, 554 | "is-stream-ended": { 555 | "version": "0.1.4", 556 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", 557 | "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" 558 | }, 559 | "is-typedarray": { 560 | "version": "1.0.0", 561 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 562 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 563 | "dev": true 564 | }, 565 | "isstream": { 566 | "version": "0.1.2", 567 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 568 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 569 | "dev": true 570 | }, 571 | "jsbn": { 572 | "version": "0.1.1", 573 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 574 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 575 | "dev": true 576 | }, 577 | "json-bigint": { 578 | "version": "1.0.0", 579 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", 580 | "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", 581 | "requires": { 582 | "bignumber.js": "^9.0.0" 583 | } 584 | }, 585 | "json-schema": { 586 | "version": "0.2.3", 587 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 588 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 589 | "dev": true 590 | }, 591 | "json-schema-traverse": { 592 | "version": "0.4.1", 593 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 594 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 595 | "dev": true 596 | }, 597 | "json-stringify-safe": { 598 | "version": "5.0.1", 599 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 600 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 601 | "dev": true 602 | }, 603 | "jsprim": { 604 | "version": "1.4.1", 605 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 606 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 607 | "dev": true, 608 | "requires": { 609 | "assert-plus": "1.0.0", 610 | "extsprintf": "1.3.0", 611 | "json-schema": "0.2.3", 612 | "verror": "1.10.0" 613 | } 614 | }, 615 | "jwa": { 616 | "version": "2.0.0", 617 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 618 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 619 | "requires": { 620 | "buffer-equal-constant-time": "1.0.1", 621 | "ecdsa-sig-formatter": "1.0.11", 622 | "safe-buffer": "^5.0.1" 623 | } 624 | }, 625 | "jws": { 626 | "version": "4.0.0", 627 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 628 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 629 | "requires": { 630 | "jwa": "^2.0.0", 631 | "safe-buffer": "^5.0.1" 632 | } 633 | }, 634 | "lodash.camelcase": { 635 | "version": "4.3.0", 636 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 637 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 638 | }, 639 | "lodash.snakecase": { 640 | "version": "4.1.1", 641 | "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", 642 | "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" 643 | }, 644 | "long": { 645 | "version": "4.0.0", 646 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 647 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 648 | }, 649 | "lru-cache": { 650 | "version": "6.0.0", 651 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 652 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 653 | "requires": { 654 | "yallist": "^4.0.0" 655 | } 656 | }, 657 | "mime": { 658 | "version": "2.4.7", 659 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", 660 | "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==" 661 | }, 662 | "mime-db": { 663 | "version": "1.40.0", 664 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 665 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", 666 | "dev": true 667 | }, 668 | "mime-types": { 669 | "version": "2.1.24", 670 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 671 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 672 | "dev": true, 673 | "requires": { 674 | "mime-db": "1.40.0" 675 | } 676 | }, 677 | "ms": { 678 | "version": "2.1.2", 679 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 680 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 681 | }, 682 | "node-fetch": { 683 | "version": "2.6.1", 684 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 685 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 686 | }, 687 | "node-forge": { 688 | "version": "0.10.0", 689 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", 690 | "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" 691 | }, 692 | "oauth-sign": { 693 | "version": "0.9.0", 694 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 695 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 696 | "dev": true 697 | }, 698 | "once": { 699 | "version": "1.4.0", 700 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 701 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 702 | "requires": { 703 | "wrappy": "1" 704 | } 705 | }, 706 | "p-defer": { 707 | "version": "3.0.0", 708 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", 709 | "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" 710 | }, 711 | "performance-now": { 712 | "version": "2.1.0", 713 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 714 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 715 | "dev": true 716 | }, 717 | "protobufjs": { 718 | "version": "6.10.2", 719 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", 720 | "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", 721 | "requires": { 722 | "@protobufjs/aspromise": "^1.1.2", 723 | "@protobufjs/base64": "^1.1.2", 724 | "@protobufjs/codegen": "^2.0.4", 725 | "@protobufjs/eventemitter": "^1.1.0", 726 | "@protobufjs/fetch": "^1.1.0", 727 | "@protobufjs/float": "^1.0.2", 728 | "@protobufjs/inquire": "^1.1.0", 729 | "@protobufjs/path": "^1.1.2", 730 | "@protobufjs/pool": "^1.1.0", 731 | "@protobufjs/utf8": "^1.1.0", 732 | "@types/long": "^4.0.1", 733 | "@types/node": "^13.7.0", 734 | "long": "^4.0.0" 735 | }, 736 | "dependencies": { 737 | "@types/node": { 738 | "version": "13.13.39", 739 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.39.tgz", 740 | "integrity": "sha512-wct+WgRTTkBm2R3vbrFOqyZM5w0g+D8KnhstG9463CJBVC3UVZHMToge7iMBR1vDl/I+NWFHUeK9X+JcF0rWKw==" 741 | } 742 | } 743 | }, 744 | "psl": { 745 | "version": "1.2.0", 746 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", 747 | "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==", 748 | "dev": true 749 | }, 750 | "punycode": { 751 | "version": "2.1.1", 752 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 753 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 754 | "dev": true 755 | }, 756 | "qs": { 757 | "version": "6.5.2", 758 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 759 | "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", 760 | "dev": true 761 | }, 762 | "readable-stream": { 763 | "version": "3.6.0", 764 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 765 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 766 | "requires": { 767 | "inherits": "^2.0.3", 768 | "string_decoder": "^1.1.1", 769 | "util-deprecate": "^1.0.1" 770 | } 771 | }, 772 | "request": { 773 | "version": "2.88.0", 774 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 775 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 776 | "dev": true, 777 | "requires": { 778 | "aws-sign2": "~0.7.0", 779 | "aws4": "^1.8.0", 780 | "caseless": "~0.12.0", 781 | "combined-stream": "~1.0.6", 782 | "extend": "~3.0.2", 783 | "forever-agent": "~0.6.1", 784 | "form-data": "~2.3.2", 785 | "har-validator": "~5.1.0", 786 | "http-signature": "~1.2.0", 787 | "is-typedarray": "~1.0.0", 788 | "isstream": "~0.1.2", 789 | "json-stringify-safe": "~5.0.1", 790 | "mime-types": "~2.1.19", 791 | "oauth-sign": "~0.9.0", 792 | "performance-now": "^2.1.0", 793 | "qs": "~6.5.2", 794 | "safe-buffer": "^5.1.2", 795 | "tough-cookie": "~2.4.3", 796 | "tunnel-agent": "^0.6.0", 797 | "uuid": "^3.3.2" 798 | } 799 | }, 800 | "retry-request": { 801 | "version": "4.1.3", 802 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.3.tgz", 803 | "integrity": "sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ==", 804 | "requires": { 805 | "debug": "^4.1.1" 806 | } 807 | }, 808 | "safe-buffer": { 809 | "version": "5.1.2", 810 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 811 | "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" 812 | }, 813 | "safer-buffer": { 814 | "version": "2.1.2", 815 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 816 | "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", 817 | "dev": true 818 | }, 819 | "semver": { 820 | "version": "7.3.4", 821 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", 822 | "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", 823 | "requires": { 824 | "lru-cache": "^6.0.0" 825 | } 826 | }, 827 | "sshpk": { 828 | "version": "1.16.1", 829 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 830 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 831 | "dev": true, 832 | "requires": { 833 | "asn1": "~0.2.3", 834 | "assert-plus": "^1.0.0", 835 | "bcrypt-pbkdf": "^1.0.0", 836 | "dashdash": "^1.12.0", 837 | "ecc-jsbn": "~0.1.1", 838 | "getpass": "^0.1.1", 839 | "jsbn": "~0.1.0", 840 | "safer-buffer": "^2.0.2", 841 | "tweetnacl": "~0.14.0" 842 | } 843 | }, 844 | "stream-shift": { 845 | "version": "1.0.1", 846 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 847 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 848 | }, 849 | "string_decoder": { 850 | "version": "1.3.0", 851 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 852 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 853 | "requires": { 854 | "safe-buffer": "~5.2.0" 855 | }, 856 | "dependencies": { 857 | "safe-buffer": { 858 | "version": "5.2.1", 859 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 860 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 861 | } 862 | } 863 | }, 864 | "tough-cookie": { 865 | "version": "2.4.3", 866 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 867 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 868 | "dev": true, 869 | "requires": { 870 | "psl": "^1.1.24", 871 | "punycode": "^1.4.1" 872 | }, 873 | "dependencies": { 874 | "punycode": { 875 | "version": "1.4.1", 876 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 877 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 878 | "dev": true 879 | } 880 | } 881 | }, 882 | "tunnel-agent": { 883 | "version": "0.6.0", 884 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 885 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 886 | "dev": true, 887 | "requires": { 888 | "safe-buffer": "^5.0.1" 889 | } 890 | }, 891 | "tweetnacl": { 892 | "version": "0.14.5", 893 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 894 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 895 | "dev": true 896 | }, 897 | "uri-js": { 898 | "version": "4.2.2", 899 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 900 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 901 | "dev": true, 902 | "requires": { 903 | "punycode": "^2.1.0" 904 | } 905 | }, 906 | "util-deprecate": { 907 | "version": "1.0.2", 908 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 909 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 910 | }, 911 | "uuid": { 912 | "version": "3.3.2", 913 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 914 | "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", 915 | "dev": true 916 | }, 917 | "verror": { 918 | "version": "1.10.0", 919 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 920 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 921 | "dev": true, 922 | "requires": { 923 | "assert-plus": "^1.0.0", 924 | "core-util-is": "1.0.2", 925 | "extsprintf": "^1.2.0" 926 | } 927 | }, 928 | "wrappy": { 929 | "version": "1.0.2", 930 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 931 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 932 | }, 933 | "yallist": { 934 | "version": "4.0.0", 935 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 936 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 937 | } 938 | } 939 | } 940 | -------------------------------------------------------------------------------- /webhook/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daily-webhook", 3 | "main": "index.js", 4 | "private": true, 5 | "scripts": { 6 | "deploy": "gcloud --project devkit-prod beta functions deploy webhook --runtime nodejs10 --trigger-http --env-vars-file .env.yaml" 7 | }, 8 | "engines": { 9 | "node": "~10.15.0" 10 | }, 11 | "devDependencies": { 12 | "request": "^2.88.0" 13 | }, 14 | "dependencies": { 15 | "@google-cloud/pubsub": "^2.7.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /webhook/utils.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const fs = require('fs'); 4 | const request = require('request'); 5 | 6 | const secret = process.env.WEBHOOK_SECRET; 7 | const webhook = process.env.WEBHOOK_URL; 8 | const user = process.env.USER; 9 | const pass = process.env.PASS; 10 | 11 | 12 | const sendOnePayload = (payloads) => { 13 | if (!payloads.length) { 14 | console.log('done!'); 15 | process.exit(); 16 | } 17 | 18 | request({ 19 | url: 'https://push.superfeedr.com/', 20 | method: 'POST', 21 | form: payloads[0], 22 | auth: { 23 | user, 24 | pass, 25 | sendImmediately: true, 26 | }, 27 | }, (err) => { 28 | if (err) { 29 | console.error(`failed to add ${payloads[0]['hub.topic']}`); 30 | process.exit(1); 31 | } else { 32 | sendOnePayload(payloads.slice(1)); 33 | } 34 | }); 35 | }; 36 | 37 | const payloads = fs.readFileSync('sources.csv') 38 | .toString() 39 | .split('\n') 40 | .map((line) => { 41 | const cols = line.split(','); 42 | return { 43 | 'hub.mode': 'subscribe', 44 | 'hub.topic': cols[1], 45 | 'hub.callback': `${webhook}/${cols[0]}`, 46 | 'hub.secret': secret, 47 | format: 'json', 48 | }; 49 | }); 50 | 51 | sendOnePayload(payloads); 52 | --------------------------------------------------------------------------------