@keeper-security/keeperapi 16.0.0 → 16.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.idea/keeperapi.iml +12 -0
- package/.idea/modules.xml +8 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/5e18f43a9b613f6f6f2302b3a4e5176f6bc92fc5 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/61937b699b545d77d9bb72af5e7182c1803ae24c +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/7fbbd271f2a6fe2a55d7ee5e3ad7716e7cf051ba +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/85bbe002887f4018a0fe647b8b05194dbc048f66 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/8f851753b53908ad3f972c31696dbdeeed9b4661 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/9eb60cc6282da763987e9a366716c57e69db7cbc +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/dc4d6f4549ac6f4017ff017e35d2349480068cdf +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/e4d5be0687b96b93a032d9922fa511f04ed27deb +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/code/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/5e18f43a9b613f6f6f2302b3a4e5176f6bc92fc5 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/61937b699b545d77d9bb72af5e7182c1803ae24c +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/7fbbd271f2a6fe2a55d7ee5e3ad7716e7cf051ba +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/85bbe002887f4018a0fe647b8b05194dbc048f66 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/8f851753b53908ad3f972c31696dbdeeed9b4661 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/9eb60cc6282da763987e9a366716c57e69db7cbc +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/dc4d6f4549ac6f4017ff017e35d2349480068cdf +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/e4d5be0687b96b93a032d9922fa511f04ed27deb +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/semanticDiagnostics/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/5e18f43a9b613f6f6f2302b3a4e5176f6bc92fc5 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/61937b699b545d77d9bb72af5e7182c1803ae24c +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/7fbbd271f2a6fe2a55d7ee5e3ad7716e7cf051ba +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/85bbe002887f4018a0fe647b8b05194dbc048f66 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/8f851753b53908ad3f972c31696dbdeeed9b4661 +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/9eb60cc6282da763987e9a366716c57e69db7cbc +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/dc4d6f4549ac6f4017ff017e35d2349480068cdf +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/e4d5be0687b96b93a032d9922fa511f04ed27deb +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/syntacticDiagnostics/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/24fbc0427075baf3ac3fee2ada4ddd2fdd6804a6 +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/3050043c8485297b366404c9b699f00a98a44b3c +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/4dffa8599530c3200ba2fa8029fa291435ba7cf7 +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/6a0bc58668c059b99bff8dba6f0246cb049f0db9 +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/7351d2ef4cb3d5388301a3ad1d1f7e3a0782c0bd +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/8d7296121e0007eebc1b0eabcfcc2a262d6bbc22 +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/8fe39fe93705cfe38c1944a307c3fd64e5985d1e +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/9f92f7bfd4bd0aa870a95101ec02f2a32337ff1f +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/a6e317ef3069e9a270811fbc729535be3c405f41 +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/ac8bef3228680d10f4db046facede43040f41854 +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/afe32918d3a600939f39f4fcfb6852fe43f8ada9 +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/bbe22fc71946abdfc667c2388606bfe83397ec81 +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/d7bc52f98e9a008b81c621d963e9d4a276c80ee3 +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/ddcd4d72185f8c85750f6f2f755c1152fddafdf4 +0 -0
- package/.rpt2_cache/rpt2_02b50c05ca0c5f1826efd221b9443199179ac6f1/types/cache/df632d4bb144fc3001f92ea2a2678baeb386dcc4 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/0155dc333b076ed1526d900b68620ead8c8d8b6b +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/09a21931f2a982e751cd2b7ce45fa6df0bfdbfc6 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/0bd8fcd9e5871476984908e9d214bc12244a56c7 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/4af634b56884c8fd08ba3107422b0108644ee513 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/624184538e182d7e8888620f356c12b51bbcc6ca +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/67074a8d808b8e4a0c15d67f36f13664fcff8143 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/934e86e88e5eef117e7f7c7e98bb7b13ee83e8af +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/a282f7f4f34b6e0f7604a1e31cac2d2efbc0304c +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/b1af8b4bca5d49b190d355a5d7186b277280db7e +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/b5f1f1702282c76ceff0f0ff97a3ba80b5adeccc +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/bcfb396489824911797b349d7388000f2b3a3298 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/f2e98088f53c88114a0a5322154f96a639246440 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/code/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/0155dc333b076ed1526d900b68620ead8c8d8b6b +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/09a21931f2a982e751cd2b7ce45fa6df0bfdbfc6 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/0bd8fcd9e5871476984908e9d214bc12244a56c7 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/4af634b56884c8fd08ba3107422b0108644ee513 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/624184538e182d7e8888620f356c12b51bbcc6ca +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/67074a8d808b8e4a0c15d67f36f13664fcff8143 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/934e86e88e5eef117e7f7c7e98bb7b13ee83e8af +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/a282f7f4f34b6e0f7604a1e31cac2d2efbc0304c +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/b1af8b4bca5d49b190d355a5d7186b277280db7e +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/b5f1f1702282c76ceff0f0ff97a3ba80b5adeccc +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/bcfb396489824911797b349d7388000f2b3a3298 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/f2e98088f53c88114a0a5322154f96a639246440 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/semanticDiagnostics/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/0155dc333b076ed1526d900b68620ead8c8d8b6b +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/09a21931f2a982e751cd2b7ce45fa6df0bfdbfc6 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/0bd8fcd9e5871476984908e9d214bc12244a56c7 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/4af634b56884c8fd08ba3107422b0108644ee513 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/624184538e182d7e8888620f356c12b51bbcc6ca +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/67074a8d808b8e4a0c15d67f36f13664fcff8143 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/934e86e88e5eef117e7f7c7e98bb7b13ee83e8af +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/a282f7f4f34b6e0f7604a1e31cac2d2efbc0304c +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/b1af8b4bca5d49b190d355a5d7186b277280db7e +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/b5f1f1702282c76ceff0f0ff97a3ba80b5adeccc +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/bcfb396489824911797b349d7388000f2b3a3298 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/f2e98088f53c88114a0a5322154f96a639246440 +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/syntacticDiagnostics/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/24fbc0427075baf3ac3fee2ada4ddd2fdd6804a6 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/3050043c8485297b366404c9b699f00a98a44b3c +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/4dffa8599530c3200ba2fa8029fa291435ba7cf7 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/603166e7191a1eb2b59e6dc3a0c5060e83e42bf5 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/6a0bc58668c059b99bff8dba6f0246cb049f0db9 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/7351d2ef4cb3d5388301a3ad1d1f7e3a0782c0bd +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/8d7296121e0007eebc1b0eabcfcc2a262d6bbc22 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/8fe39fe93705cfe38c1944a307c3fd64e5985d1e +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/9f92f7bfd4bd0aa870a95101ec02f2a32337ff1f +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/a6e317ef3069e9a270811fbc729535be3c405f41 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/ac8bef3228680d10f4db046facede43040f41854 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/afe32918d3a600939f39f4fcfb6852fe43f8ada9 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/bbe22fc71946abdfc667c2388606bfe83397ec81 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/d7bc52f98e9a008b81c621d963e9d4a276c80ee3 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/ddcd4d72185f8c85750f6f2f755c1152fddafdf4 +0 -0
- package/.rpt2_cache/rpt2_3297a01a1b62f1695764463c584003ad1da34817/types/cache/df632d4bb144fc3001f92ea2a2678baeb386dcc4 +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/09a21931f2a982e751cd2b7ce45fa6df0bfdbfc6 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/5e18f43a9b613f6f6f2302b3a4e5176f6bc92fc5 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/624184538e182d7e8888620f356c12b51bbcc6ca +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/7fbbd271f2a6fe2a55d7ee5e3ad7716e7cf051ba +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/8378bbd69de2cb8546f7e5f380a4ca34a2b252ac +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/85bbe002887f4018a0fe647b8b05194dbc048f66 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/8f851753b53908ad3f972c31696dbdeeed9b4661 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/b5f1f1702282c76ceff0f0ff97a3ba80b5adeccc +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/bcfb396489824911797b349d7388000f2b3a3298 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/dc4d6f4549ac6f4017ff017e35d2349480068cdf +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/e4d5be0687b96b93a032d9922fa511f04ed27deb +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/f2e98088f53c88114a0a5322154f96a639246440 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/code/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/09a21931f2a982e751cd2b7ce45fa6df0bfdbfc6 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/5e18f43a9b613f6f6f2302b3a4e5176f6bc92fc5 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/624184538e182d7e8888620f356c12b51bbcc6ca +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/7fbbd271f2a6fe2a55d7ee5e3ad7716e7cf051ba +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/8378bbd69de2cb8546f7e5f380a4ca34a2b252ac +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/85bbe002887f4018a0fe647b8b05194dbc048f66 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/8f851753b53908ad3f972c31696dbdeeed9b4661 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/b5f1f1702282c76ceff0f0ff97a3ba80b5adeccc +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/bcfb396489824911797b349d7388000f2b3a3298 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/dc4d6f4549ac6f4017ff017e35d2349480068cdf +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/e4d5be0687b96b93a032d9922fa511f04ed27deb +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/f2e98088f53c88114a0a5322154f96a639246440 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/semanticDiagnostics/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/09a21931f2a982e751cd2b7ce45fa6df0bfdbfc6 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/5e18f43a9b613f6f6f2302b3a4e5176f6bc92fc5 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/624184538e182d7e8888620f356c12b51bbcc6ca +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/7fbbd271f2a6fe2a55d7ee5e3ad7716e7cf051ba +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/8378bbd69de2cb8546f7e5f380a4ca34a2b252ac +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/85bbe002887f4018a0fe647b8b05194dbc048f66 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/8f851753b53908ad3f972c31696dbdeeed9b4661 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/b5f1f1702282c76ceff0f0ff97a3ba80b5adeccc +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/bcfb396489824911797b349d7388000f2b3a3298 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/dc4d6f4549ac6f4017ff017e35d2349480068cdf +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/e4d5be0687b96b93a032d9922fa511f04ed27deb +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/f2e98088f53c88114a0a5322154f96a639246440 +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/syntacticDiagnostics/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/24fbc0427075baf3ac3fee2ada4ddd2fdd6804a6 +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/3050043c8485297b366404c9b699f00a98a44b3c +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/4dffa8599530c3200ba2fa8029fa291435ba7cf7 +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/6a0bc58668c059b99bff8dba6f0246cb049f0db9 +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/7351d2ef4cb3d5388301a3ad1d1f7e3a0782c0bd +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/8d7296121e0007eebc1b0eabcfcc2a262d6bbc22 +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/8fe39fe93705cfe38c1944a307c3fd64e5985d1e +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/9f92f7bfd4bd0aa870a95101ec02f2a32337ff1f +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/a6e317ef3069e9a270811fbc729535be3c405f41 +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/ac8bef3228680d10f4db046facede43040f41854 +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/afe32918d3a600939f39f4fcfb6852fe43f8ada9 +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/bbe22fc71946abdfc667c2388606bfe83397ec81 +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/d7bc52f98e9a008b81c621d963e9d4a276c80ee3 +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/ddcd4d72185f8c85750f6f2f755c1152fddafdf4 +0 -0
- package/.rpt2_cache/rpt2_695cfcfdb8ad5fdc842bebc6c6523fff84b97236/types/cache/df632d4bb144fc3001f92ea2a2678baeb386dcc4 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/0155dc333b076ed1526d900b68620ead8c8d8b6b +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/0bd8fcd9e5871476984908e9d214bc12244a56c7 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/4af634b56884c8fd08ba3107422b0108644ee513 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/61937b699b545d77d9bb72af5e7182c1803ae24c +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/651b0423c46988097da560167e3f6f432e8fbfc8 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/67074a8d808b8e4a0c15d67f36f13664fcff8143 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/934e86e88e5eef117e7f7c7e98bb7b13ee83e8af +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/b1af8b4bca5d49b190d355a5d7186b277280db7e +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/code/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/0155dc333b076ed1526d900b68620ead8c8d8b6b +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/0bd8fcd9e5871476984908e9d214bc12244a56c7 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/4af634b56884c8fd08ba3107422b0108644ee513 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/61937b699b545d77d9bb72af5e7182c1803ae24c +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/651b0423c46988097da560167e3f6f432e8fbfc8 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/67074a8d808b8e4a0c15d67f36f13664fcff8143 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/934e86e88e5eef117e7f7c7e98bb7b13ee83e8af +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/b1af8b4bca5d49b190d355a5d7186b277280db7e +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/semanticDiagnostics/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/0155dc333b076ed1526d900b68620ead8c8d8b6b +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/0bd8fcd9e5871476984908e9d214bc12244a56c7 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/1c87a75f7bda91e438f008e21dafe531c949031d +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/4af634b56884c8fd08ba3107422b0108644ee513 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/55ab809efdb0061fba3df7fa2029e2706a361534 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/61937b699b545d77d9bb72af5e7182c1803ae24c +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/651b0423c46988097da560167e3f6f432e8fbfc8 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/67074a8d808b8e4a0c15d67f36f13664fcff8143 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/6eb75399e6e0179b01b9d8cb1afc01f5068ef4f0 +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/7c0e3c33301dea7e674a558fac5e4f028dbaa3ad +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/934e86e88e5eef117e7f7c7e98bb7b13ee83e8af +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/b1af8b4bca5d49b190d355a5d7186b277280db7e +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/syntacticDiagnostics/cache/f385a84342a7d9131d8da13c2546cde25fa23f1d +1 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/24fbc0427075baf3ac3fee2ada4ddd2fdd6804a6 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/3050043c8485297b366404c9b699f00a98a44b3c +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/4dffa8599530c3200ba2fa8029fa291435ba7cf7 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/603166e7191a1eb2b59e6dc3a0c5060e83e42bf5 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/6a0bc58668c059b99bff8dba6f0246cb049f0db9 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/7351d2ef4cb3d5388301a3ad1d1f7e3a0782c0bd +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/8d7296121e0007eebc1b0eabcfcc2a262d6bbc22 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/8fe39fe93705cfe38c1944a307c3fd64e5985d1e +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/9f92f7bfd4bd0aa870a95101ec02f2a32337ff1f +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/a6e317ef3069e9a270811fbc729535be3c405f41 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/ac8bef3228680d10f4db046facede43040f41854 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/afe32918d3a600939f39f4fcfb6852fe43f8ada9 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/bbe22fc71946abdfc667c2388606bfe83397ec81 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/d7bc52f98e9a008b81c621d963e9d4a276c80ee3 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/ddcd4d72185f8c85750f6f2f755c1152fddafdf4 +0 -0
- package/.rpt2_cache/rpt2_91c74d821d2604d85061209debacd53e1a896747/types/cache/df632d4bb144fc3001f92ea2a2678baeb386dcc4 +0 -0
- package/babel.config.js +6 -0
- package/package.json +7 -10
- package/rollup.config.js +50 -0
- package/scripts/cleanDistFolder.js +9 -0
- package/src/__tests__/utils.test.js +13 -0
- package/src/auth.ts +1514 -0
- package/src/browser/asn1hex.ts +296 -0
- package/src/browser/index.ts +17 -0
- package/src/browser/jsbn.ts +1213 -0
- package/src/browser/platform.ts +434 -0
- package/src/browser/rng.ts +15 -0
- package/src/browser/rsa.ts +262 -0
- package/src/commands.ts +1378 -0
- package/src/company.ts +244 -0
- package/src/configuration.ts +125 -0
- package/src/endpoint.ts +350 -0
- package/src/node/index.ts +17 -0
- package/src/node/platform.ts +283 -0
- package/src/platform.ts +76 -0
- package/src/proto.d.ts +50992 -0
- package/src/proto.js +136564 -0
- package/src/restMessages.ts +311 -0
- package/src/utils.ts +169 -0
- package/src/vault.ts +844 -0
- package/src/vendorContext.ts +69 -0
- package/src/vendorModel.ts +36 -0
- package/tsconfig.json +14 -0
- package/tsconfig.rollup.json +14 -0
package/src/endpoint.ts
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import {KeeperCommand, KeeperHttpResponse} from './commands'
|
|
2
|
+
import {KeeperError} from './configuration'
|
|
3
|
+
import {Authentication, Push, SsoCloud} from './proto'
|
|
4
|
+
import {platform} from './platform'
|
|
5
|
+
import {
|
|
6
|
+
generateTransmissionKey,
|
|
7
|
+
getKeeperUrl,
|
|
8
|
+
isTwoFactorResultCode,
|
|
9
|
+
normal64,
|
|
10
|
+
normal64Bytes,
|
|
11
|
+
webSafe64FromBytes
|
|
12
|
+
} from './utils'
|
|
13
|
+
import {
|
|
14
|
+
deviceMessage,
|
|
15
|
+
preLoginMessage,
|
|
16
|
+
registerDeviceMessage,
|
|
17
|
+
registerDeviceInRegionMessage,
|
|
18
|
+
RestMessage,
|
|
19
|
+
ssoCloudRequestMessage,
|
|
20
|
+
updateDeviceMessage
|
|
21
|
+
} from './restMessages'
|
|
22
|
+
import {ClientConfigurationInternal, TransmissionKey} from './configuration';
|
|
23
|
+
import ApiRequestPayload = Authentication.ApiRequestPayload;
|
|
24
|
+
import ApiRequest = Authentication.ApiRequest;
|
|
25
|
+
import IDeviceResponse = Authentication.IDeviceResponse;
|
|
26
|
+
import IPreLoginResponse = Authentication.IPreLoginResponse;
|
|
27
|
+
import WssClientResponse = Push.WssClientResponse;
|
|
28
|
+
import WssConnectionRequest = Push.WssConnectionRequest;
|
|
29
|
+
import SsoCloudResponse = SsoCloud.SsoCloudResponse;
|
|
30
|
+
|
|
31
|
+
export class KeeperEndpoint {
|
|
32
|
+
private transmissionKey: TransmissionKey
|
|
33
|
+
public deviceToken: Uint8Array
|
|
34
|
+
public clientVersion
|
|
35
|
+
|
|
36
|
+
private onsitePrivateKey: Uint8Array | null = null
|
|
37
|
+
private onsitePublicKey: Uint8Array | null = null
|
|
38
|
+
|
|
39
|
+
constructor(private options: ClientConfigurationInternal) {
|
|
40
|
+
if (options.deviceToken) {
|
|
41
|
+
this.deviceToken = options.deviceToken
|
|
42
|
+
this.transmissionKey = generateTransmissionKey(1)
|
|
43
|
+
} else {
|
|
44
|
+
this.transmissionKey = generateTransmissionKey(options.deviceConfig.transmissionKeyId || 1)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private getUrl(forPath: string): string {
|
|
49
|
+
return getKeeperUrl(this.options.host, forPath)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async getDeviceToken(): Promise<IDeviceResponse> {
|
|
53
|
+
return this.executeRest(deviceMessage({
|
|
54
|
+
clientVersion: this.clientVersion,
|
|
55
|
+
deviceName: 'JS Keeper API'
|
|
56
|
+
}))
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async getPreLogin(username: string): Promise<IPreLoginResponse> {
|
|
60
|
+
|
|
61
|
+
if (!this.deviceToken) {
|
|
62
|
+
console.log('Obtaining device token...')
|
|
63
|
+
let deviceResponse = await this.getDeviceToken()
|
|
64
|
+
this.deviceToken = deviceResponse.encryptedDeviceToken
|
|
65
|
+
if (this.options.onDeviceToken) {
|
|
66
|
+
this.options.onDeviceToken(this.deviceToken)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
while (true) {
|
|
71
|
+
try {
|
|
72
|
+
return await this.executeRest(preLoginMessage({
|
|
73
|
+
authRequest: {
|
|
74
|
+
clientVersion: this.clientVersion,
|
|
75
|
+
username: username,
|
|
76
|
+
encryptedDeviceToken: this.deviceToken
|
|
77
|
+
},
|
|
78
|
+
loginType: Authentication.LoginType.NORMAL
|
|
79
|
+
}))
|
|
80
|
+
} catch (e) {
|
|
81
|
+
if (!(e instanceof Error))
|
|
82
|
+
throw(e)
|
|
83
|
+
let errorObj = JSON.parse(e.message)
|
|
84
|
+
if (errorObj.error === 'region_redirect') {
|
|
85
|
+
this.options.host = errorObj.region_host
|
|
86
|
+
console.log(`Redirecting to ${this.options.host}`)
|
|
87
|
+
} else {
|
|
88
|
+
throw(e)
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async registerDevice() {
|
|
95
|
+
// Case 1 new device, no edt no keys - call registration with pub key
|
|
96
|
+
// Case 2 existing device on 14, edt but no keys - call device update
|
|
97
|
+
// Case 3 existing device on 15+, has edt and keys - skip registration
|
|
98
|
+
|
|
99
|
+
const deviceConfig = this.options.deviceConfig
|
|
100
|
+
|
|
101
|
+
if (deviceConfig.deviceToken && deviceConfig.privateKey && deviceConfig.publicKey) { // Case 1
|
|
102
|
+
return
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const ecdh = await platform.generateECKeyPair()
|
|
106
|
+
deviceConfig.publicKey = ecdh.publicKey
|
|
107
|
+
deviceConfig.privateKey = ecdh.privateKey
|
|
108
|
+
if (deviceConfig.deviceToken) {
|
|
109
|
+
const devUpdMsg = updateDeviceMessage({
|
|
110
|
+
encryptedDeviceToken: deviceConfig.deviceToken,
|
|
111
|
+
clientVersion: this.options.clientVersion,
|
|
112
|
+
deviceName: deviceConfig.deviceName,
|
|
113
|
+
devicePublicKey: deviceConfig.publicKey,
|
|
114
|
+
})
|
|
115
|
+
await this.executeRest(devUpdMsg)
|
|
116
|
+
} else {
|
|
117
|
+
const devRegMsg = registerDeviceMessage({
|
|
118
|
+
clientVersion: this.options.clientVersion,
|
|
119
|
+
deviceName: deviceConfig.deviceName,
|
|
120
|
+
devicePublicKey: deviceConfig.publicKey,
|
|
121
|
+
})
|
|
122
|
+
const devRegResp = await this.executeRest(devRegMsg)
|
|
123
|
+
console.log(devRegResp)
|
|
124
|
+
deviceConfig.deviceToken = devRegResp.encryptedDeviceToken || null
|
|
125
|
+
}
|
|
126
|
+
if (this.options.onDeviceConfig) {
|
|
127
|
+
this.options.onDeviceConfig(deviceConfig, this.options.host);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async executeRest<TIn, TOut>(message: RestMessage<TIn, TOut>, sessionToken?: string): Promise<TOut> {
|
|
132
|
+
while (true) {
|
|
133
|
+
let request = await this.prepareRequest(message.toBytes(), sessionToken)
|
|
134
|
+
console.log("Calling REST URL:", this.getUrl(message.path));
|
|
135
|
+
let response = await platform.post(this.getUrl(message.path), request)
|
|
136
|
+
if (!response.data || response.data.length === 0 && response.statusCode === 200) {
|
|
137
|
+
return
|
|
138
|
+
}
|
|
139
|
+
console.log("Response code:", response.statusCode);
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
let decrypted = await platform.aesGcmDecrypt(response.data, this.transmissionKey.key)
|
|
143
|
+
return message.fromBytes(decrypted)
|
|
144
|
+
} catch {
|
|
145
|
+
const errorMessage = platform.bytesToString(response.data.slice(0, 1000))
|
|
146
|
+
try {
|
|
147
|
+
const errorObj: KeeperError = JSON.parse(errorMessage)
|
|
148
|
+
switch (errorObj.error) {
|
|
149
|
+
case 'key':
|
|
150
|
+
this.updateTransmissionKey(errorObj.key_id)
|
|
151
|
+
continue
|
|
152
|
+
case 'region_redirect':
|
|
153
|
+
this.options.host = errorObj.region_host
|
|
154
|
+
if (this.options.onRegionChanged) {
|
|
155
|
+
this.options.onRegionChanged(this.options.host);
|
|
156
|
+
}
|
|
157
|
+
continue
|
|
158
|
+
case 'device_not_registered': {
|
|
159
|
+
if (this.options.deviceConfig.deviceToken) {
|
|
160
|
+
await this.executeRest(registerDeviceInRegionMessage({
|
|
161
|
+
clientVersion: this.options.clientVersion,
|
|
162
|
+
deviceName: this.options.deviceConfig.deviceName,
|
|
163
|
+
devicePublicKey: this.options.deviceConfig.publicKey,
|
|
164
|
+
encryptedDeviceToken: this.options.deviceConfig.deviceToken
|
|
165
|
+
}))
|
|
166
|
+
continue
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (this.options.onCommandFailure) {
|
|
171
|
+
this.options.onCommandFailure({ ...errorObj, ...{ path: message.path } })
|
|
172
|
+
}
|
|
173
|
+
} catch {
|
|
174
|
+
}
|
|
175
|
+
throw(new Error(errorMessage))
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async executeV2Command<T>(command: KeeperCommand): Promise<T> {
|
|
181
|
+
command.client_version = this.clientVersion
|
|
182
|
+
let requestBytes = await this.prepareRequest(command)
|
|
183
|
+
let response = await platform.post(this.getUrl('vault/execute_v2_command'), requestBytes)
|
|
184
|
+
let decrypted
|
|
185
|
+
try {
|
|
186
|
+
decrypted = await platform.aesGcmDecrypt(response.data, this.transmissionKey.key)
|
|
187
|
+
} catch (e) {
|
|
188
|
+
let error = platform.bytesToString(response.data)
|
|
189
|
+
throw(`Unable to decrypt response: ${error}`)
|
|
190
|
+
}
|
|
191
|
+
let json = JSON.parse(platform.bytesToString(decrypted))
|
|
192
|
+
if (json.result !== 'success' && !isTwoFactorResultCode(json.result_code)) {
|
|
193
|
+
throw(json)
|
|
194
|
+
}
|
|
195
|
+
return json as T
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
async get(path: string): Promise<KeeperHttpResponse> {
|
|
199
|
+
return platform.get(this.getUrl(path), {})
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
public updateTransmissionKey(keyNumber: number) {
|
|
203
|
+
this.transmissionKey = generateTransmissionKey(keyNumber)
|
|
204
|
+
|
|
205
|
+
this.options.deviceConfig.transmissionKeyId = keyNumber
|
|
206
|
+
if (this.options.onDeviceConfig) {
|
|
207
|
+
this.options.onDeviceConfig(this.options.deviceConfig, this.options.host);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
public async prepareRequest(payload: Uint8Array | KeeperCommand, sessionToken?: string): Promise<Uint8Array> {
|
|
212
|
+
return prepareApiRequest(payload, this.transmissionKey, sessionToken)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
async decryptPushMessage(pushMessageData: Uint8Array): Promise<WssClientResponse> {
|
|
216
|
+
const decryptedPushMessage = await platform.aesGcmDecrypt(pushMessageData, this.transmissionKey.key)
|
|
217
|
+
return WssClientResponse.decode(decryptedPushMessage)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async getPushConnectionRequest(messageSessionUid: Uint8Array) {
|
|
221
|
+
return getPushConnectionRequest(messageSessionUid, this.options.deviceConfig.deviceToken, this.transmissionKey)
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
getTransmissionKey(): TransmissionKey {
|
|
225
|
+
return this.transmissionKey;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
public async prepareSsoPayload(messageSessionUid: Uint8Array, username: string = '', idpSessionId = ''): Promise<string> {
|
|
229
|
+
const payload = ssoCloudRequestMessage({
|
|
230
|
+
"embedded": true,
|
|
231
|
+
"clientVersion": this.clientVersion,
|
|
232
|
+
"dest": "vault",
|
|
233
|
+
"forceLogin": false,
|
|
234
|
+
"messageSessionUid": messageSessionUid,
|
|
235
|
+
"idpSessionId": idpSessionId,
|
|
236
|
+
"username": username
|
|
237
|
+
}).toBytes()
|
|
238
|
+
const request = await prepareApiRequest(payload, this.transmissionKey)
|
|
239
|
+
return webSafe64FromBytes(request)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
public async decryptCloudSsoResponse(token: string): Promise<SsoCloudResponse> {
|
|
243
|
+
return decryptCloudSsoResponse(token, this.getTransmissionKey().key)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
public async getOnsitePublicKey(): Promise<string> {
|
|
247
|
+
if (!this.onsitePublicKey || !this.onsitePrivateKey) {
|
|
248
|
+
const {privateKey, publicKey} = await platform.generateRSAKeyPair()
|
|
249
|
+
|
|
250
|
+
this.onsitePrivateKey = privateKey
|
|
251
|
+
this.onsitePublicKey = publicKey
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return webSafe64FromBytes(this.onsitePublicKey)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
public decryptOnsiteSsoPassword(password: string): string {
|
|
258
|
+
const encryptedPasswordBytes = normal64Bytes(password)
|
|
259
|
+
const decryptedPassword = platform.privateDecrypt(encryptedPasswordBytes, this.onsitePrivateKey)
|
|
260
|
+
return platform.bytesToString(decryptedPassword)
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export async function getPushConnectionRequest(messageSessionUid: Uint8Array, encryptedDeviceToken: Uint8Array, transmissionKey: TransmissionKey) {
|
|
265
|
+
const connectionRequest = WssConnectionRequest.create({
|
|
266
|
+
messageSessionUid: messageSessionUid,
|
|
267
|
+
encryptedDeviceToken: encryptedDeviceToken,
|
|
268
|
+
deviceTimeStamp: new Date().getTime()
|
|
269
|
+
})
|
|
270
|
+
const connectionRequestBytes = WssConnectionRequest.encode(connectionRequest).finish()
|
|
271
|
+
const apiRequest = await prepareApiRequest(connectionRequestBytes, transmissionKey)
|
|
272
|
+
return webSafe64FromBytes(apiRequest)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export async function prepareApiRequest(payload: Uint8Array | KeeperCommand, transmissionKey: TransmissionKey, sessionToken?: string): Promise<Uint8Array> {
|
|
276
|
+
const requestPayload = ApiRequestPayload.create()
|
|
277
|
+
if (payload) {
|
|
278
|
+
requestPayload.payload = payload instanceof Uint8Array
|
|
279
|
+
? payload
|
|
280
|
+
: Buffer.from(JSON.stringify(payload))
|
|
281
|
+
}
|
|
282
|
+
if (sessionToken) {
|
|
283
|
+
requestPayload.encryptedSessionToken = normal64Bytes(sessionToken);
|
|
284
|
+
}
|
|
285
|
+
let requestPayloadBytes = ApiRequestPayload.encode(requestPayload).finish()
|
|
286
|
+
let encryptedRequestPayload = await platform.aesGcmEncrypt(requestPayloadBytes, transmissionKey.key)
|
|
287
|
+
let apiRequest = ApiRequest.create({
|
|
288
|
+
encryptedTransmissionKey: transmissionKey.encryptedKey,
|
|
289
|
+
encryptedPayload: encryptedRequestPayload,
|
|
290
|
+
publicKeyId: transmissionKey.publicKeyId,
|
|
291
|
+
locale: 'en_US'
|
|
292
|
+
})
|
|
293
|
+
return ApiRequest.encode(apiRequest).finish()
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export async function decryptCloudSsoResponse(cloudResponseToken: string, key: Uint8Array): Promise<SsoCloudResponse> {
|
|
297
|
+
const decryptedData = await platform.aesGcmDecrypt(normal64Bytes(cloudResponseToken), key);
|
|
298
|
+
return SsoCloudResponse.decode(decryptedData);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export enum KeeperEnvironment {
|
|
302
|
+
Prod = 'keepersecurity.com',
|
|
303
|
+
QA = 'qa.keepersecurity.com',
|
|
304
|
+
DEV = 'dev.keepersecurity.com',
|
|
305
|
+
DEV2 = 'dev2.keepersecurity.com',
|
|
306
|
+
LOCAL = 'local.keepersecurity.com',
|
|
307
|
+
Prod_EU = 'keepersecurity.eu',
|
|
308
|
+
QA_EU = 'qa.keepersecurity.eu',
|
|
309
|
+
DEV_EU = 'dev.keepersecurity.eu',
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
interface KeeperKeys {
|
|
313
|
+
der: string[],
|
|
314
|
+
pem: string[]
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
let keys =
|
|
318
|
+
{
|
|
319
|
+
der: {
|
|
320
|
+
key1: 'MIIBCgKCAQEA9Z/CZzxiNUz8+npqI4V10+zW3AL7+M4UQDdd/17759Xzm0MOEfHOOsOgZxxNK1DEsbyCTCE05fd3Hz1mn1uGjXvm5HnN2mL/3TOVxyLU6VwH9EDInnj4DNMFifs69il3KlviT3llRgPCcjF4xrF8d4SR0/N3eqS1f9CBJPNEKEH+am5Xb/FqAlOUoXkILF0UYxA/jNLoWBSq+1W58e4xDI0p0GuP0lN8f97HBtfB7ijbtF+VxIXtxRy+4jA49zK+CQrGmWqIm5DzZcBvUtVGZ3UXd6LeMXMJOifvuCneGC2T2uB6G2g5yD54+onmKIETyNX0LtpR1MsZmKLgru5ugwIDAQAB',
|
|
321
|
+
key2: 'MIIBCgKCAQEAkOpym7xC3sSysw5DAidLoVF7JUgnvXejbieDWmEiD-DQOKxzfQqYHoFfeeix__bx3wMW3I8cAc8zwZ1JO8hyB2ON732JE2Zp301GAUMnAK_rBhQWmYKP_-uXSKeTJPiuaW9PVG0oRJ4MEdS-t1vIA4eDPhI1EexHaY3P2wHKoV8twcGvdWUZB5gxEpMbx5CuvEXptnXEJlxKou3TZu9uwJIo0pgqVLUgRpW1RSRipgutpUslBnQ72Bdbsry0KKVTlcPsudAnnWUtsMJNgmyQbESPm-aVv-GzdVUFvWKpKkAxDpNArPMf0xt8VL2frw2LDe5_n9IMFogUiSYt156_mQIDAQAB',
|
|
322
|
+
key3: 'MIIBCgKCAQEAyvxCWbLvtMRmq57oFg3mY4DWfkb1dir7b29E8UcwcKDcCsGTqoIhubU2pO46TVUXmFgC4E-Zlxt-9F-YA-MY7i_5GrDvySwAy4nbDhRL6Z0kz-rqUirgm9WWsP9v-X_BwzARqq83HNBuzAjf3UHgYDsKmCCarVAzRplZdT3Q5rnNiYPYSHzwfUhKEAyXk71UdtleD-bsMAmwnuYHLhDHiT279An_Ta93c9MTqa_Tq2Eirl_NXn1RdtbNohmMXldAH-C8uIh3Sz8erS4hZFSdUG1WlDsKpyRouNPQ3diorbO88wEAgpHjXkOLj63d1fYJBFG0yfu73U80aEZehQkSawIDAQAB',
|
|
323
|
+
key4: 'MIIBCgKCAQEA0TVoXLpgluaqw3P011zFPSIzWhUMBqXT-Ocjy8NKjJbdrbs53eRFKk1waeB3hNn5JEKNVSNbUIe-MjacB9P34iCfKtdnrdDB8JXx0nIbIPzLtcJC4HCYASpjX_TVXrU9BgeCE3NUtnIxjHDy8PCbJyAS_Pv299Q_wpLWnkkjq70ZJ2_fX-ObbQaZHwsWKbRZ_5sD6rLfxNACTGI_jo9-vVug6AdNq96J7nUdYV1cG-INQwJJKMcAbKQcLrml8CMPc2mmf0KQ5MbS_KSbLXHUF-81AsZVHfQRSuigOStQKxgSGL5osY4NrEcODbEXtkuDrKNMsZYhijKiUHBj9vvgKwIDAQAB',
|
|
324
|
+
key5: 'MIIBCgKCAQEAueOWC26w-HlOLW7s88WeWkXpjxK4mkjqngIzwbjnsU9145R51HvsILvjXJNdAuueVDHj3OOtQjfUM6eMMLr-3kaPv68y4FNusvB49uKc5ETI0HtHmHFSn9qAZvC7dQHSpYqC2TeCus-xKeUciQ5AmSfwpNtwzM6Oh2TO45zAqSA-QBSk_uv9TJu0e1W1AlNmizQtHX6je-mvqZCVHkzGFSQWQ8DBL9dHjviI2mmWfL_egAVVhBgTFXRHg5OmJbbPoHj217Yh-kHYA8IWEAHylboH6CVBdrNL4Na0fracQVTm-nOWdM95dKk3fH-KJYk_SmwB47ndWACLLi5epLl9vwIDAQAB',
|
|
325
|
+
key6: 'MIIBCgKCAQEA2PJRM7-4R97rHwY_zCkFA8B3llawb6gF7oAZCpxprl6KB5z2cqLAvUfEOBtnr7RIturX04p3ThnwaFnAR7ADVZWBGOYuAyaLzGHDI5mvs8D-NewG9vw8qRkTT7Mb8fuOHC6-_lTp9AF2OA2H4QYiT1vt43KbuD0Y2CCVrOTKzDMXG8msl_JvAKt4axY9RGUtBbv0NmpkBCjLZri5AaTMgjLdu8XBXCqoLx7qZL-Bwiv4njw-ZAI4jIszJTdGzMtoQ0zL7LBj_TDUBI4Qhf2bZTZlUSL3xeDWOKmd8Frksw3oKyJ17oCQK-EGau6EaJRGyasBXl8uOEWmYYgqOWirNwIDAQAB'
|
|
326
|
+
},
|
|
327
|
+
pem: {
|
|
328
|
+
key1: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9Z/CZzxiNUz8+npqI4V1\n0+zW3AL7+M4UQDdd/17759Xzm0MOEfHOOsOgZxxNK1DEsbyCTCE05fd3Hz1mn1uG\njXvm5HnN2mL/3TOVxyLU6VwH9EDInnj4DNMFifs69il3KlviT3llRgPCcjF4xrF8\nd4SR0/N3eqS1f9CBJPNEKEH+am5Xb/FqAlOUoXkILF0UYxA/jNLoWBSq+1W58e4x\nDI0p0GuP0lN8f97HBtfB7ijbtF+VxIXtxRy+4jA49zK+CQrGmWqIm5DzZcBvUtVG\nZ3UXd6LeMXMJOifvuCneGC2T2uB6G2g5yD54+onmKIETyNX0LtpR1MsZmKLgru5u\ngwIDAQAB\n-----END PUBLIC KEY-----\n',
|
|
329
|
+
key2: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkOpym7xC3sSysw5DAidL\noVF7JUgnvXejbieDWmEiD+DQOKxzfQqYHoFfeeix//bx3wMW3I8cAc8zwZ1JO8hy\nB2ON732JE2Zp301GAUMnAK/rBhQWmYKP/+uXSKeTJPiuaW9PVG0oRJ4MEdS+t1vI\nA4eDPhI1EexHaY3P2wHKoV8twcGvdWUZB5gxEpMbx5CuvEXptnXEJlxKou3TZu9u\nwJIo0pgqVLUgRpW1RSRipgutpUslBnQ72Bdbsry0KKVTlcPsudAnnWUtsMJNgmyQ\nbESPm+aVv+GzdVUFvWKpKkAxDpNArPMf0xt8VL2frw2LDe5/n9IMFogUiSYt156/\nmQIDAQAB\n-----END PUBLIC KEY-----\n',
|
|
330
|
+
key3: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyvxCWbLvtMRmq57oFg3m\nY4DWfkb1dir7b29E8UcwcKDcCsGTqoIhubU2pO46TVUXmFgC4E+Zlxt+9F+YA+MY\n7i/5GrDvySwAy4nbDhRL6Z0kz+rqUirgm9WWsP9v+X/BwzARqq83HNBuzAjf3UHg\nYDsKmCCarVAzRplZdT3Q5rnNiYPYSHzwfUhKEAyXk71UdtleD+bsMAmwnuYHLhDH\niT279An/Ta93c9MTqa/Tq2Eirl/NXn1RdtbNohmMXldAH+C8uIh3Sz8erS4hZFSd\nUG1WlDsKpyRouNPQ3diorbO88wEAgpHjXkOLj63d1fYJBFG0yfu73U80aEZehQkS\nawIDAQAB\n-----END PUBLIC KEY-----\n',
|
|
331
|
+
key4: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0TVoXLpgluaqw3P011zF\nPSIzWhUMBqXT+Ocjy8NKjJbdrbs53eRFKk1waeB3hNn5JEKNVSNbUIe+MjacB9P3\n4iCfKtdnrdDB8JXx0nIbIPzLtcJC4HCYASpjX/TVXrU9BgeCE3NUtnIxjHDy8PCb\nJyAS/Pv299Q/wpLWnkkjq70ZJ2/fX+ObbQaZHwsWKbRZ/5sD6rLfxNACTGI/jo9+\nvVug6AdNq96J7nUdYV1cG+INQwJJKMcAbKQcLrml8CMPc2mmf0KQ5MbS/KSbLXHU\nF+81AsZVHfQRSuigOStQKxgSGL5osY4NrEcODbEXtkuDrKNMsZYhijKiUHBj9vvg\nKwIDAQAB\n-----END PUBLIC KEY-----\n',
|
|
332
|
+
key5: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAueOWC26w+HlOLW7s88We\nWkXpjxK4mkjqngIzwbjnsU9145R51HvsILvjXJNdAuueVDHj3OOtQjfUM6eMMLr+\n3kaPv68y4FNusvB49uKc5ETI0HtHmHFSn9qAZvC7dQHSpYqC2TeCus+xKeUciQ5A\nmSfwpNtwzM6Oh2TO45zAqSA+QBSk/uv9TJu0e1W1AlNmizQtHX6je+mvqZCVHkzG\nFSQWQ8DBL9dHjviI2mmWfL/egAVVhBgTFXRHg5OmJbbPoHj217Yh+kHYA8IWEAHy\nlboH6CVBdrNL4Na0fracQVTm+nOWdM95dKk3fH+KJYk/SmwB47ndWACLLi5epLl9\nvwIDAQAB\n-----END PUBLIC KEY-----\n',
|
|
333
|
+
key6: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2PJRM7+4R97rHwY/zCkF\nA8B3llawb6gF7oAZCpxprl6KB5z2cqLAvUfEOBtnr7RIturX04p3ThnwaFnAR7AD\nVZWBGOYuAyaLzGHDI5mvs8D+NewG9vw8qRkTT7Mb8fuOHC6+/lTp9AF2OA2H4QYi\nT1vt43KbuD0Y2CCVrOTKzDMXG8msl/JvAKt4axY9RGUtBbv0NmpkBCjLZri5AaTM\ngjLdu8XBXCqoLx7qZL+Bwiv4njw+ZAI4jIszJTdGzMtoQ0zL7LBj/TDUBI4Qhf2b\nZTZlUSL3xeDWOKmd8Frksw3oKyJ17oCQK+EGau6EaJRGyasBXl8uOEWmYYgqOWir\nNwIDAQAB\n-----END PUBLIC KEY-----\n'
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
let _keeperKeys: KeeperKeys = {
|
|
338
|
+
der: [], pem: []
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
for (let key in keys.der) {
|
|
342
|
+
_keeperKeys.der.push(normal64(keys.der[key]))
|
|
343
|
+
}
|
|
344
|
+
for (let key in keys.pem) {
|
|
345
|
+
_keeperKeys.pem.push(keys.pem[key])
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
export const keeperKeys: KeeperKeys = _keeperKeys
|
|
349
|
+
|
|
350
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from "../endpoint";
|
|
2
|
+
export * from "../auth";
|
|
3
|
+
export * from "../vendorContext";
|
|
4
|
+
export * from "../vendorModel";
|
|
5
|
+
export * from "../vault";
|
|
6
|
+
export * from "../company";
|
|
7
|
+
export * from "../configuration";
|
|
8
|
+
export * from "../commands";
|
|
9
|
+
export * from "../restMessages";
|
|
10
|
+
export * from "../utils";
|
|
11
|
+
export * from "../platform";
|
|
12
|
+
export * from "../proto";
|
|
13
|
+
import {connectPlatform} from "../platform";
|
|
14
|
+
import {nodePlatform} from "./platform";
|
|
15
|
+
|
|
16
|
+
connectPlatform(nodePlatform);
|
|
17
|
+
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import * as crypto from "crypto";
|
|
2
|
+
import {createECDH} from "crypto";
|
|
3
|
+
import * as https from "https";
|
|
4
|
+
import * as FormData from "form-data"
|
|
5
|
+
import * as NodeRSA from 'node-rsa';
|
|
6
|
+
import * as WebSocket from 'faye-websocket'
|
|
7
|
+
|
|
8
|
+
import {KeyWrapper, Platform} from "../platform";
|
|
9
|
+
import {RSA_PKCS1_PADDING} from "constants";
|
|
10
|
+
import {KeeperHttpResponse} from "../commands";
|
|
11
|
+
import {keeperKeys} from "../endpoint";
|
|
12
|
+
import {SocketProxy, socketSendMessage} from '../auth'
|
|
13
|
+
|
|
14
|
+
export const nodePlatform: Platform = class {
|
|
15
|
+
static keys = keeperKeys.pem;
|
|
16
|
+
|
|
17
|
+
static getRandomBytes(length: number): Uint8Array {
|
|
18
|
+
return crypto.randomBytes(length);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static bytesToBase64(data: Uint8Array): string {
|
|
22
|
+
return Buffer.from(data).toString("base64");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
static base64ToBytes(data: string): Uint8Array {
|
|
26
|
+
return Buffer.from(data, "base64");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
static bytesToString(data: Uint8Array): string {
|
|
30
|
+
return Buffer.from(data).toString();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
static stringToBytes(data: string): Uint8Array {
|
|
34
|
+
return Buffer.from(data);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
static wrapPassword(password: Uint8Array): KeyWrapper {
|
|
38
|
+
return KeyWrapper.create(password)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
static unWrapPassword(password: KeyWrapper): Uint8Array {
|
|
42
|
+
return password.getKey()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static async generateRSAKeyPair(): Promise<{ privateKey: Uint8Array; publicKey: Uint8Array}> {
|
|
46
|
+
const rsaKeys = new NodeRSA({b: 2048});
|
|
47
|
+
const rsaPublicKey: Buffer = rsaKeys.exportKey('public-der');
|
|
48
|
+
const rsaPrivateKey: Buffer = rsaKeys.exportKey('private-der');
|
|
49
|
+
return Promise.resolve({
|
|
50
|
+
privateKey: rsaPrivateKey,
|
|
51
|
+
publicKey: rsaPublicKey
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static async generateECKeyPair(): Promise<{ privateKey: Uint8Array; publicKey: Uint8Array }> {
|
|
56
|
+
const ecdh = createECDH('prime256v1')
|
|
57
|
+
ecdh.generateKeys()
|
|
58
|
+
return Promise.resolve({
|
|
59
|
+
privateKey: ecdh.getPrivateKey(),
|
|
60
|
+
publicKey: ecdh.getPublicKey()
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static publicEncrypt(data: Uint8Array, key: string): Uint8Array {
|
|
65
|
+
let publicKey = key[0] === '-' // PEM or DER?
|
|
66
|
+
? key
|
|
67
|
+
: crypto.createPublicKey({
|
|
68
|
+
key: Buffer.from(key, 'base64'),
|
|
69
|
+
type: 'pkcs1',
|
|
70
|
+
format: 'der'
|
|
71
|
+
})
|
|
72
|
+
return crypto.publicEncrypt({
|
|
73
|
+
key: publicKey,
|
|
74
|
+
padding: RSA_PKCS1_PADDING
|
|
75
|
+
}, data)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
static async publicEncryptEC(data: Uint8Array, key: Uint8Array, id?: Uint8Array): Promise<Uint8Array> {
|
|
79
|
+
const ecdh = createECDH('prime256v1')
|
|
80
|
+
ecdh.generateKeys()
|
|
81
|
+
const ephemeralPublicKey = ecdh.getPublicKey()
|
|
82
|
+
const sharedSecret = ecdh.computeSecret(key)
|
|
83
|
+
const sharedSecretCombined = Buffer.concat([sharedSecret, id || new Uint8Array()])
|
|
84
|
+
const symmetricKey = crypto.createHash("SHA256").update(sharedSecretCombined).digest()
|
|
85
|
+
const encryptedData = await this.aesGcmEncrypt(data, symmetricKey)
|
|
86
|
+
return Buffer.concat([ephemeralPublicKey, encryptedData])
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
static privateDecrypt(data: Uint8Array, key: Uint8Array): Uint8Array {
|
|
90
|
+
return crypto.privateDecrypt({
|
|
91
|
+
key: crypto.createPrivateKey({
|
|
92
|
+
key: Buffer.from(key),
|
|
93
|
+
type: 'pkcs1',
|
|
94
|
+
format: 'der',
|
|
95
|
+
}),
|
|
96
|
+
padding: RSA_PKCS1_PADDING
|
|
97
|
+
}, data);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
static async privateDecryptEC(data: Uint8Array, privateKey: Uint8Array, publicKey?: Uint8Array, id?: Uint8Array): Promise<Uint8Array> {
|
|
101
|
+
const ecdh = createECDH('prime256v1')
|
|
102
|
+
ecdh.setPrivateKey(privateKey)
|
|
103
|
+
const publicKeyLength = 65
|
|
104
|
+
const ephemeralPublicKey = data.slice(0, publicKeyLength)
|
|
105
|
+
const sharedSecret = ecdh.computeSecret(ephemeralPublicKey)
|
|
106
|
+
const sharedSecretCombined = Buffer.concat([sharedSecret, id || new Uint8Array()])
|
|
107
|
+
const symmetricKey = crypto.createHash("SHA256").update(sharedSecretCombined).digest()
|
|
108
|
+
const encryptedData = data.slice(publicKeyLength)
|
|
109
|
+
return await this.aesGcmDecrypt(encryptedData, symmetricKey)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static privateSign(data: Uint8Array, key: string): Promise<Uint8Array> {
|
|
113
|
+
return Promise.resolve(crypto
|
|
114
|
+
.createSign("SHA256")
|
|
115
|
+
.update(data)
|
|
116
|
+
.sign(key));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
static aesGcmEncrypt(data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {
|
|
120
|
+
let iv = crypto.randomBytes(12);
|
|
121
|
+
let cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
|
|
122
|
+
let encrypted = Buffer.concat([cipher.update(data), cipher.final()]);
|
|
123
|
+
const tag = cipher.getAuthTag();
|
|
124
|
+
let result = Buffer.concat([iv, encrypted, tag]);
|
|
125
|
+
return Promise.resolve(result);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
static aesGcmDecrypt(data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {
|
|
129
|
+
let iv = data.subarray(0, 12);
|
|
130
|
+
let encrypted = data.subarray(12, data.length - 16);
|
|
131
|
+
let tag = data.subarray(data.length - 16);
|
|
132
|
+
let cipher = crypto.createDecipheriv("aes-256-gcm", key, iv);
|
|
133
|
+
cipher.setAuthTag(tag);
|
|
134
|
+
return Promise.resolve(Buffer.concat([cipher.update(encrypted), cipher.final()]));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
static async aesCbcEncrypt(data: Uint8Array, key: Uint8Array, usePadding: boolean): Promise<Uint8Array> {
|
|
138
|
+
let iv = crypto.randomBytes(16);
|
|
139
|
+
let cipher = crypto
|
|
140
|
+
.createCipheriv("aes-256-cbc", key, iv)
|
|
141
|
+
.setAutoPadding(usePadding);
|
|
142
|
+
let encrypted = Buffer.concat([cipher.update(data), cipher.final()]);
|
|
143
|
+
return Buffer.concat([iv, encrypted]);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
static async aesCbcDecrypt(data: Uint8Array, key: Uint8Array, usePadding: boolean): Promise<Uint8Array> {
|
|
147
|
+
let iv = data.subarray(0, 16);
|
|
148
|
+
let encrypted = data.subarray(16);
|
|
149
|
+
let cipher = crypto
|
|
150
|
+
.createDecipheriv("aes-256-cbc", key, iv)
|
|
151
|
+
.setAutoPadding(usePadding);
|
|
152
|
+
return Buffer.concat([cipher.update(encrypted), cipher.final()]);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
static deriveKey(password: KeyWrapper, saltBytes: Uint8Array, iterations: number): Promise<Uint8Array> {
|
|
156
|
+
return Promise.resolve(crypto.pbkdf2Sync(password.getKey(), saltBytes, iterations, 32, 'SHA256'));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
static deriveKeyV2(domain: string, password: KeyWrapper, saltBytes: Uint8Array, iterations: number): Promise<Uint8Array> {
|
|
160
|
+
const bytes = crypto.pbkdf2Sync(Buffer.of(...Buffer.from(domain), ...nodePlatform.unWrapPassword(password.getKey())), saltBytes, iterations, 64, 'SHA512')
|
|
161
|
+
const reducedBytes = crypto.createHmac("SHA256", bytes).update(Buffer.from(domain)).digest()
|
|
162
|
+
return Promise.resolve(reducedBytes);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
static calcAuthVerifier(key: Uint8Array): Promise<Uint8Array> {
|
|
166
|
+
return Promise.resolve(crypto.createHash("SHA256").update(key).digest());
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
static get(
|
|
170
|
+
url: string,
|
|
171
|
+
headers?: {[key: string]: string}
|
|
172
|
+
): Promise<KeeperHttpResponse> {
|
|
173
|
+
return new Promise<KeeperHttpResponse>((resolve, reject) => {
|
|
174
|
+
let get = https.request(url, {
|
|
175
|
+
method: "get",
|
|
176
|
+
headers: {
|
|
177
|
+
"User-Agent": `Node/${process.version}`,
|
|
178
|
+
...headers
|
|
179
|
+
}
|
|
180
|
+
}, (res) => {
|
|
181
|
+
this.fetchData(res, resolve);
|
|
182
|
+
});
|
|
183
|
+
get.on('error', reject)
|
|
184
|
+
get.end();
|
|
185
|
+
})
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
static post(
|
|
189
|
+
url: string,
|
|
190
|
+
request: Uint8Array | string,
|
|
191
|
+
headers?: {[key: string]: string}
|
|
192
|
+
): Promise<KeeperHttpResponse> {
|
|
193
|
+
return new Promise<KeeperHttpResponse>((resolve, reject) => {
|
|
194
|
+
let post = https.request(url, {
|
|
195
|
+
method: "post",
|
|
196
|
+
headers: {
|
|
197
|
+
"Content-Type": "application/octet-stream",
|
|
198
|
+
"Content-Length": request.length,
|
|
199
|
+
"User-Agent": `Node/${process.version}`,
|
|
200
|
+
...headers,
|
|
201
|
+
},
|
|
202
|
+
}, (res) => {
|
|
203
|
+
this.fetchData(res, resolve)
|
|
204
|
+
});
|
|
205
|
+
post.on('error', reject)
|
|
206
|
+
post.write(request);
|
|
207
|
+
post.end();
|
|
208
|
+
})
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
static fileUpload(
|
|
212
|
+
url: string,
|
|
213
|
+
uploadParameters: {[key: string]: string},
|
|
214
|
+
data: Uint8Array
|
|
215
|
+
): Promise<any> {
|
|
216
|
+
return new Promise<any>((resolve, reject) => {
|
|
217
|
+
const form = new FormData()
|
|
218
|
+
|
|
219
|
+
for (const key in uploadParameters) {
|
|
220
|
+
form.append(key, uploadParameters[key]);
|
|
221
|
+
}
|
|
222
|
+
form.append('file', data)
|
|
223
|
+
|
|
224
|
+
let post = https.request(url, {
|
|
225
|
+
method: "post",
|
|
226
|
+
headers: form.getHeaders()
|
|
227
|
+
});
|
|
228
|
+
form.pipe(post)
|
|
229
|
+
post.on('error', reject)
|
|
230
|
+
post.on('response', function (res: any) {
|
|
231
|
+
resolve({
|
|
232
|
+
headers: res.headers,
|
|
233
|
+
statusCode: res.statusCode,
|
|
234
|
+
statusMessage: res.statusMessage
|
|
235
|
+
})
|
|
236
|
+
})
|
|
237
|
+
})
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
private static fetchData(res, resolve) {
|
|
241
|
+
let retVal = {
|
|
242
|
+
statusCode: res.statusCode,
|
|
243
|
+
headers: res.headers,
|
|
244
|
+
data: null
|
|
245
|
+
};
|
|
246
|
+
res.on("data", data => {
|
|
247
|
+
retVal.data = retVal.data
|
|
248
|
+
? Buffer.concat([retVal.data, data])
|
|
249
|
+
: data
|
|
250
|
+
});
|
|
251
|
+
res.on("end", () => {
|
|
252
|
+
resolve(retVal);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
static createWebsocket(url: string): SocketProxy {
|
|
257
|
+
const socket = new WebSocket.Client(url)
|
|
258
|
+
let createdSocket;
|
|
259
|
+
return createdSocket = {
|
|
260
|
+
onOpen: (callback: () => void) => {
|
|
261
|
+
socket.on('open', callback)
|
|
262
|
+
},
|
|
263
|
+
close: () => {
|
|
264
|
+
socket.close()
|
|
265
|
+
},
|
|
266
|
+
onClose: (callback: (e:Event) => void) => {
|
|
267
|
+
socket.on('close', callback)
|
|
268
|
+
},
|
|
269
|
+
onError: (callback: (err: Error) => void) => {
|
|
270
|
+
socket.on('error', callback)
|
|
271
|
+
},
|
|
272
|
+
onMessage: (callback: (e: Uint8Array) => void) => {
|
|
273
|
+
socket.on('message', (e: MessageEvent) => {
|
|
274
|
+
callback(e.data)
|
|
275
|
+
})
|
|
276
|
+
},
|
|
277
|
+
send: (message => {
|
|
278
|
+
socketSendMessage(message, socket, createdSocket)
|
|
279
|
+
}),
|
|
280
|
+
messageQueue: [],
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
};
|