   5 5 5 {"files":{"node_modules":{"files":{"ajv":{"files":{".runkit_example.js":{"size":496,"offset":"0","integrity":{"algorithm":"SHA256","hash":"e37e85bf1db5d53a6e4e38a9cac83db25208f28c09a2fa19e3971877c8a7b8cf","blockSize":4194304,"blocks":["e37e85bf1db5d53a6e4e38a9cac83db25208f28c09a2fa19e3971877c8a7b8cf"]}},"LICENSE":{"size":1090,"offset":"496","integrity":{"algorithm":"SHA256","hash":"a05350a88e318e4f5f2c2a1ff1e2e88daa4dd38e6e78b71cccae422bdc762cc3","blockSize":4194304,"blocks":["a05350a88e318e4f5f2c2a1ff1e2e88daa4dd38e6e78b71cccae422bdc762cc3"]}},"dist":{"files":{"2019.js":{"size":3188,"offset":"1586","integrity":{"algorithm":"SHA256","hash":"4a1b1d479d0b946af0119f3a3960fcabfd964e1c20e87f7a9575f8f9e705d0c4","blockSize":4194304,"blocks":["4a1b1d479d0b946af0119f3a3960fcabfd964e1c20e87f7a9575f8f9e705d0c4"]}},"2020.js":{"size":2894,"offset":"4774","integrity":{"algorithm":"SHA256","hash":"908e9670b478b2ba126802a221b7e47006f50cf467e2c5dd7935d3dbef10a20a","blockSize":4194304,"blocks":["908e9670b478b2ba126802a221b7e47006f50cf467e2c5dd7935d3dbef10a20a"]}},"ajv.js":{"size":2841,"offset":"7668","integrity":{"algorithm":"SHA256","hash":"edaed56fc546f5551b0d6dc2ff2a9cc25c2d6c83318a086eaa8c3ad0b2479297","blockSize":4194304,"blocks":["edaed56fc546f5551b0d6dc2ff2a9cc25c2d6c83318a086eaa8c3ad0b2479297"]}},"compile":{"files":{"codegen":{"files":{"code.js":{"size":4676,"offset":"10509","integrity":{"algorithm":"SHA256","hash":"1287153722f1fc3c5342647de7ae1d7b6fb68bdb3378a0776a937d273fc97e0d","blockSize":4194304,"blocks":["1287153722f1fc3c5342647de7ae1d7b6fb68bdb3378a0776a937d273fc97e0d"]}},"index.js":{"size":23127,"offset":"15185","integrity":{"algorithm":"SHA256","hash":"f03b2b72597ef86878d1d4030580c2d0964046efad4867f3d05aa91065ba034c","blockSize":4194304,"blocks":["f03b2b72597ef86878d1d4030580c2d0964046efad4867f3d05aa91065ba034c"]}},"scope.js":{"size":5198,"offset":"38312","integrity":{"algorithm":"SHA256","hash":"d2a0a97af2faa2cad88702314fe421e235ab17f11e0d62883d58d8d4dc734286","blockSize":4194304,"blocks":["d2a0a97af2faa2cad88702314fe421e235ab17f11e0d62883d58d8d4dc734286"]}}}},"errors.js":{"size":5771,"offset":"43510","integrity":{"algorithm":"SHA256","hash":"53990f8f2cc05922bba410ae68231d3f869de4f8343277ede5b4834fa564c6c2","blockSize":4194304,"blocks":["53990f8f2cc05922bba410ae68231d3f869de4f8343277ede5b4834fa564c6c2"]}},"index.js":{"size":10046,"offset":"49281","integrity":{"algorithm":"SHA256","hash":"05b34da22814f3787bfa3ac68dad59c9047f56e55a607e0a20719ebf5afe69ac","blockSize":4194304,"blocks":["05b34da22814f3787bfa3ac68dad59c9047f56e55a607e0a20719ebf5afe69ac"]}},"jtd":{"files":{"parse.js":{"size":13727,"offset":"59327","integrity":{"algorithm":"SHA256","hash":"548b7e6ee5558360945f261e092cd328662868995877140ed2ae7ff981300b7f","blockSize":4194304,"blocks":["548b7e6ee5558360945f261e092cd328662868995877140ed2ae7ff981300b7f"]}},"serialize.js":{"size":9391,"offset":"73054","integrity":{"algorithm":"SHA256","hash":"1f8b1873fbd899240cd625144d3cd10630b3cf1b0c69c640566f6e25c80765c0","blockSize":4194304,"blocks":["1f8b1873fbd899240cd625144d3cd10630b3cf1b0c69c640566f6e25c80765c0"]}},"types.js":{"size":291,"offset":"82445","integrity":{"algorithm":"SHA256","hash":"e92a89e57c3b7d228be4e2e74c71ef3af52320bf061b411add9dccc34ddb0a78","blockSize":4194304,"blocks":["e92a89e57c3b7d228be4e2e74c71ef3af52320bf061b411add9dccc34ddb0a78"]}}}},"names.js":{"size":1440,"offset":"82736","integrity":{"algorithm":"SHA256","hash":"3cab37a2240b996b9bed92fe7a041d91689cfe3ad2e9ae4c0ab99e4146408493","blockSize":4194304,"blocks":["3cab37a2240b996b9bed92fe7a041d91689cfe3ad2e9ae4c0ab99e4146408493"]}},"ref_error.js":{"size":543,"offset":"84176","integrity":{"algorithm":"SHA256","hash":"81c98fdf34c3037c91bfcc02277ec32156c71e34048f36cfe4e084416e916cb7","blockSize":4194304,"blocks":["81c98fdf34c3037c91bfcc02277ec32156c71e34048f36cfe4e084416e916cb7"]}},"resolve.js":{"size":5006,"offset":"84719","integrity":{"algorithm":"SHA256","hash":"df75af0e0cf03fa1c6452e8dc61019f5aec645a8a5f6f494dc4e13cb5502d2d9","blockSize":4194304,"blocks":["df75af0e0cf03fa1c6452e8dc61019f5aec645a8a5f6f494dc4e13cb5502d2d9"]}},"rules.js":{"size":918,"offset":"89725","integrity":{"algorithm":"SHA256","hash":"ec1d86500f497aa8e20f9f0c1695951159d9a909669d00a261ce1bb22b3cf0a9","blockSize":4194304,"blocks":["ec1d86500f497aa8e20f9f0c1695951159d9a909669d00a261ce1bb22b3cf0a9"]}},"util.js":{"size":7103,"offset":"90643","integrity":{"algorithm":"SHA256","hash":"fa911f5631f29d4d6420adfe086cb693b94b08de2719475c78c54bcb82f831a5","blockSize":4194304,"blocks":["fa911f5631f29d4d6420adfe086cb693b94b08de2719475c78c54bcb82f831a5"]}},"validate":{"files":{"applicability.js":{"size":853,"offset":"97746","integrity":{"algorithm":"SHA256","hash":"50c5cba5894a7fb9874b3432355b46ec71b73c9368dafb1323ded8567cca8fc0","blockSize":4194304,"blocks":["50c5cba5894a7fb9874b3432355b46ec71b73c9368dafb1323ded8567cca8fc0"]}},"boolSchema.js":{"size":1531,"offset":"98599","integrity":{"algorithm":"SHA256","hash":"c08abdbdbd3d8b1dcc0552a20fbc7d837ed44f4ca6abb2e464985590ac94377f","blockSize":4194304,"blocks":["c08abdbdbd3d8b1dcc0552a20fbc7d837ed44f4ca6abb2e464985590ac94377f"]}},"dataType.js":{"size":8409,"offset":"100130","integrity":{"algorithm":"SHA256","hash":"697bd7005361ec7066a23c18830a10b0ef28aec1a33138b4e3098bf78c4fae52","blockSize":4194304,"blocks":["697bd7005361ec7066a23c18830a10b0ef28aec1a33138b4e3098bf78c4fae52"]}},"defaults.js":{"size":1448,"offset":"108539","integrity":{"algorithm":"SHA256","hash":"05721971df94faa57b09c8cfd60c2eef81b6d14910a7dea5f539d693a029c428","blockSize":4194304,"blocks":["05721971df94faa57b09c8cfd60c2eef81b6d14910a7dea5f539d693a029c428"]}},"index.js":{"size":20552,"offset":"109987","integrity":{"algorithm":"SHA256","hash":"cb2103e5f890e04592c10d24b45857dad91155bae9f9460138a2459bdaaea2cd","blockSize":4194304,"blocks":["cb2103e5f890e04592c10d24b45857dad91155bae9f9460138a2459bdaaea2cd"]}},"keyword.js":{"size":5695,"offset":"130539","integrity":{"algorithm":"SHA256","hash":"ab8f070c75c25eee9be5c837f364748909b58f5db66149a2beccbd2f66afeb76","blockSize":4194304,"blocks":["ab8f070c75c25eee9be5c837f364748909b58f5db66149a2beccbd2f66afeb76"]}},"subschema.js":{"size":3858,"offset":"136234","integrity":{"algorithm":"SHA256","hash":"ca783d6052af91e65ebb59a5b48b47fb459a2241d37ca6a042f767d4ce451bdc","blockSize":4194304,"blocks":["ca783d6052af91e65ebb59a5b48b47fb459a2241d37ca6a042f767d4ce451bdc"]}}}}}},"core.js":{"size":25185,"offset":"140092","integrity":{"algorithm":"SHA256","hash":"7fdd03e949ecb3d020e560f669da71ce69a70f4bca28e5aff2ebc34d15bc2134","blockSize":4194304,"blocks":["7fdd03e949ecb3d020e560f669da71ce69a70f4bca28e5aff2ebc34d15bc2134"]}},"jtd.js":{"size":3360,"offset":"165277","integrity":{"algorithm":"SHA256","hash":"9554827c19abbb10694cafb71edd72a8303ea71e56b9eb7253200f5395610e44","blockSize":4194304,"blocks":["9554827c19abbb10694cafb71edd72a8303ea71e56b9eb7253200f5395610e44"]}},"refs":{"files":{"data.json":{"size":409,"offset":"168637","integrity":{"algorithm":"SHA256","hash":"d24ab8a97c18b3f5afdde7d7024a0e0ac1df0614a16a41cb88f81379edcc2db3","blockSize":4194304,"blocks":["d24ab8a97c18b3f5afdde7d7024a0e0ac1df0614a16a41cb88f81379edcc2db3"]}},"json-schema-2019-09":{"files":{"index.js":{"size":938,"offset":"169046","integrity":{"algorithm":"SHA256","hash":"ec400bdf35a0f290266811503cdbfffd7c18c4a690379988b8062c57b48f946d","blockSize":4194304,"blocks":["ec400bdf35a0f290266811503cdbfffd7c18c4a690379988b8062c57b48f946d"]}},"meta":{"files":{"applicator.json":{"size":1566,"offset":"169984","integrity":{"algorithm":"SHA256","hash":"9c356a52b0ad5da7d4c1b69f61dff5277c2af46221bc0b0521bbdbf3a12d3a2a","blockSize":4194304,"blocks":["9c356a52b0ad5da7d4c1b69f61dff5277c2af46221bc0b0521bbdbf3a12d3a2a"]}},"content.json":{"size":477,"offset":"171550","integrity":{"algorithm":"SHA256","hash":"cf4792ae93f4a4580ec9523640945f7756f75fd624935ebf15194b0ac3909267","blockSize":4194304,"blocks":["cf4792ae93f4a4580ec9523640945f7756f75fd624935ebf15194b0ac3909267"]}},"core.json":{"size":1273,"offset":"172027","integrity":{"algorithm":"SHA256","hash":"629c017994ffaa33f573a96cf01b9dac6cae80c7d5d17dad5e823a3afa18d5fe","blockSize":4194304,"blocks":["629c017994ffaa33f573a96cf01b9dac6cae80c7d5d17dad5e823a3afa18d5fe"]}},"format.json":{"size":375,"offset":"173300","integrity":{"algorithm":"SHA256","hash":"018ef7c81bcca9e40a4a02ed236e7cabb3a630f2b1ea01fbdeed2f882c15ddc8","blockSize":4194304,"blocks":["018ef7c81bcca9e40a4a02ed236e7cabb3a630f2b1ea01fbdeed2f882c15ddc8"]}},"meta-data.json":{"size":758,"offset":"173675","integrity":{"algorithm":"SHA256","hash":"e038593d36bf1855875a13b8812469d6a2d62ed309436b9c9a2fa5a4ba59085e","blockSize":4194304,"blocks":["e038593d36bf1855875a13b8812469d6a2d62ed309436b9c9a2fa5a4ba59085e"]}},"validation.json":{"size":2264,"offset":"174433","integrity":{"algorithm":"SHA256","hash":"aaba7f2d6fcbdfa6ca97fdc3d3da1ae7d66ca3322b7e90cf5a98b067555d06e6","blockSize":4194304,"blocks":["aaba7f2d6fcbdfa6ca97fdc3d3da1ae7d66ca3322b7e90cf5a98b067555d06e6"]}}}},"schema.json":{"size":1579,"offset":"176697","integrity":{"algorithm":"SHA256","hash":"264720afa0dd61919e21bbe9bc1312121b70e43019ac696240e069adc72cce15","blockSize":4194304,"blocks":["264720afa0dd61919e21bbe9bc1312121b70e43019ac696240e069adc72cce15"]}}}},"json-schema-2020-12":{"files":{"index.js":{"size":1026,"offset":"178276","integrity":{"algorithm":"SHA256","hash":"2e39089b0aaa14efa7901ecf5384622ec3d5897b206e1d589d2420f17b9fa6e1","blockSize":4194304,"blocks":["2e39089b0aaa14efa7901ecf5384622ec3d5897b206e1d589d2420f17b9fa6e1"]}},"meta":{"files":{"applicator.json":{"size":1441,"offset":"179302","integrity":{"algorithm":"SHA256","hash":"f1e465ff0c0cc86bee5c0cc4b51d2734c532e6ea12c75b60a2ac093a4577b2d4","blockSize":4194304,"blocks":["f1e465ff0c0cc86bee5c0cc4b51d2734c532e6ea12c75b60a2ac093a4577b2d4"]}},"content.json":{"size":479,"offset":"180743","integrity":{"algorithm":"SHA256","hash":"7ede86f2c48d646202bf1332aefaf46db268c943d59752727db7247dc2920516","blockSize":4194304,"blocks":["7ede86f2c48d646202bf1332aefaf46db268c943d59752727db7247dc2920516"]}},"core.json":{"size":1344,"offset":"181222","integrity":{"algorithm":"SHA256","hash":"c3a5947992d4fe67c95cda7910911207376bbae41c0a124ec9e7e699172e7a49","blockSize":4194304,"blocks":["c3a5947992d4fe67c95cda7910911207376bbae41c0a124ec9e7e699172e7a49"]}},"format-annotation.json":{"size":420,"offset":"182566","integrity":{"algorithm":"SHA256","hash":"1e31131b1ed21f98c007f04deb501343b8c4dd77f1c5a8494a9c2085f68d769d","blockSize":4194304,"blocks":["1e31131b1ed21f98c007f04deb501343b8c4dd77f1c5a8494a9c2085f68d769d"]}},"meta-data.json":{"size":758,"offset":"182986","integrity":{"algorithm":"SHA256","hash":"eb008c756b29bdaa237c1f06d32ea4a21f6ef22148b03c6372cea5e4c0782273","blockSize":4194304,"blocks":["eb008c756b29bdaa237c1f06d32ea4a21f6ef22148b03c6372cea5e4c0782273"]}},"unevaluated.json":{"size":472,"offset":"183744","integrity":{"algorithm":"SHA256","hash":"8f7f75f4274745faa32e4abdba12de99f49b21df225f52f723b5c62043b0edca","blockSize":4194304,"blocks":["8f7f75f4274745faa32e4abdba12de99f49b21df225f52f723b5c62043b0edca"]}},"validation.json":{"size":2264,"offset":"184216","integrity":{"algorithm":"SHA256","hash":"3cae7069843679429e4ada7df261bb8961fa34cac15be89296026e69af312092","blockSize":4194304,"blocks":["3cae7069843679429e4ada7df261bb8961fa34cac15be89296026e69af312092"]}}}},"schema.json":{"size":2166,"offset":"186480","integrity":{"algorithm":"SHA256","hash":"5333c7df76bceee098e865881d0808238dea836126c6c60b49299ec85c6c7a56","blockSize":4194304,"blocks":["5333c7df76bceee098e865881d0808238dea836126c6c60b49299ec85c6c7a56"]}}}},"json-schema-draft-06.json":{"size":3449,"offset":"188646","integrity":{"algorithm":"SHA256","hash":"a9b6a00af20105009f0924cd7c02d811bbf70c579a96f1552579c3457111f687","blockSize":4194304,"blocks":["a9b6a00af20105009f0924cd7c02d811bbf70c579a96f1552579c3457111f687"]}},"json-schema-draft-07.json":{"size":3811,"offset":"192095","integrity":{"algorithm":"SHA256","hash":"f7e8b13cad4fecff9771f3626fef33e20e59027b90938a28fd9d2f6c17cd0773","blockSize":4194304,"blocks":["f7e8b13cad4fecff9771f3626fef33e20e59027b90938a28fd9d2f6c17cd0773"]}},"json-schema-secure.json":{"size":2521,"offset":"195906","integrity":{"algorithm":"SHA256","hash":"b7840b4f1526eee47ac19780906a436d0c39df2aa3d505388caf18864085a421","blockSize":4194304,"blocks":["b7840b4f1526eee47ac19780906a436d0c39df2aa3d505388caf18864085a421"]}},"jtd-schema.js":{"size":2882,"offset":"198427","integrity":{"algorithm":"SHA256","hash":"ed529445bf027885182bbed71e5458baecec2d356a788b636ed9f0c7cdaccd92","blockSize":4194304,"blocks":["ed529445bf027885182bbed71e5458baecec2d356a788b636ed9f0c7cdaccd92"]}}}},"runtime":{"files":{"equal.js":{"size":286,"offset":"201309","integrity":{"algorithm":"SHA256","hash":"c94467da09ee94e5d194483a7ab821b9bb3bf1c04397270f2ab53dea9de59274","blockSize":4194304,"blocks":["c94467da09ee94e5d194483a7ab821b9bb3bf1c04397270f2ab53dea9de59274"]}},"parseJson.js":{"size":5401,"offset":"201595","integrity":{"algorithm":"SHA256","hash":"1bc006064c98afbbb4fc03bef49db7e85dd9493fb54a7dc647d4344ad043848e","blockSize":4194304,"blocks":["1bc006064c98afbbb4fc03bef49db7e85dd9493fb54a7dc647d4344ad043848e"]}},"quote.js":{"size":943,"offset":"206996","integrity":{"algorithm":"SHA256","hash":"1061132b1475fce15821d2b41c74b9ac710f278a33f5dae3385458715cc962b2","blockSize":4194304,"blocks":["1061132b1475fce15821d2b41c74b9ac710f278a33f5dae3385458715cc962b2"]}},"re2.js":{"size":213,"offset":"207939","integrity":{"algorithm":"SHA256","hash":"e1a6849652ae9a099c36c9aee9d2efc7412c8f83c4b285142413af99a7238361","blockSize":4194304,"blocks":["e1a6849652ae9a099c36c9aee9d2efc7412c8f83c4b285142413af99a7238361"]}},"timestamp.js":{"size":1536,"offset":"208152","integrity":{"algorithm":"SHA256","hash":"05cd4fc283b82af25a2a71ee5e587640c1d42945c74cea790627135fff338bef","blockSize":4194304,"blocks":["05cd4fc283b82af25a2a71ee5e587640c1d42945c74cea790627135fff338bef"]}},"ucs2length.js":{"size":808,"offset":"209688","integrity":{"algorithm":"SHA256","hash":"1df012dd3d23fced07255a7204798004509687cb1f431ae0ab976db436bbd890","blockSize":4194304,"blocks":["1df012dd3d23fced07255a7204798004509687cb1f431ae0ab976db436bbd890"]}},"uri.js":{"size":218,"offset":"210496","integrity":{"algorithm":"SHA256","hash":"d1d61baf97ed87d7310df847a78ed73d19c8cc003207bf5aaec977500bdb1578","blockSize":4194304,"blocks":["d1d61baf97ed87d7310df847a78ed73d19c8cc003207bf5aaec977500bdb1578"]}},"validation_error.js":{"size":337,"offset":"210714","integrity":{"algorithm":"SHA256","hash":"11bf5b4affc8114e5e7cdf65b93006c2d997ab60ada1152c22e136f9b828b815","blockSize":4194304,"blocks":["11bf5b4affc8114e5e7cdf65b93006c2d997ab60ada1152c22e136f9b828b815"]}}}},"standalone":{"files":{"index.js":{"size":4480,"offset":"211051","integrity":{"algorithm":"SHA256","hash":"361d58a7523548bb1b9c782135fae27e76d93c8feaba8c4d613331dbcd3b888f","blockSize":4194304,"blocks":["361d58a7523548bb1b9c782135fae27e76d93c8feaba8c4d613331dbcd3b888f"]}},"instance.js":{"size":1015,"offset":"215531","integrity":{"algorithm":"SHA256","hash":"4e14aa01e0cb8288fbb75deeb2e738950b0560bd02e1ad8974f391af4c9fc6f3","blockSize":4194304,"blocks":["4e14aa01e0cb8288fbb75deeb2e738950b0560bd02e1ad8974f391af4c9fc6f3"]}}}},"types":{"files":{"index.js":{"size":110,"offset":"216546","integrity":{"algorithm":"SHA256","hash":"fc9c6096246805c2075c83ab1b96082eda2fc98c240a2502caa82f1966096b71","blockSize":4194304,"blocks":["fc9c6096246805c2075c83ab1b96082eda2fc98c240a2502caa82f1966096b71"]}},"json-schema.js":{"size":116,"offset":"216656","integrity":{"algorithm":"SHA256","hash":"2e30aa0c0789b5af8248b081ddc14b439b48937730eb1be0ab28de2ca2353b28","blockSize":4194304,"blocks":["2e30aa0c0789b5af8248b081ddc14b439b48937730eb1be0ab28de2ca2353b28"]}},"jtd-schema.js":{"size":115,"offset":"216772","integrity":{"algorithm":"SHA256","hash":"6755d0ec5a09cc74205d46089f814c88c1ce4363e56a55486c12a0a86942bd8d","blockSize":4194304,"blocks":["6755d0ec5a09cc74205d46089f814c88c1ce4363e56a55486c12a0a86942bd8d"]}}}},"vocabularies":{"files":{"applicator":{"files":{"additionalItems.js":{"size":1931,"offset":"216887","integrity":{"algorithm":"SHA256","hash":"7beb0fbda5e349907067c8398bb8cc3260a6267b6e5dff9793a5ab2171934099","blockSize":4194304,"blocks":["7beb0fbda5e349907067c8398bb8cc3260a6267b6e5dff9793a5ab2171934099"]}},"additionalProperties.js":{"size":4309,"offset":"218818","integrity":{"algorithm":"SHA256","hash":"e237cb180cd2e3f2e676feb714d7dcc6a42116640f9db2ad830cd20d9dfc540a","blockSize":4194304,"blocks":["e237cb180cd2e3f2e676feb714d7dcc6a42116640f9db2ad830cd20d9dfc540a"]}},"allOf.js":{"size":756,"offset":"223127","integrity":{"algorithm":"SHA256","hash":"98f46a6434ebe5f851b406480e18b776dd7f1bcc275e28c16a13bfef3cc067c7","blockSize":4194304,"blocks":["98f46a6434ebe5f851b406480e18b776dd7f1bcc275e28c16a13bfef3cc067c7"]}},"anyOf.js":{"size":343,"offset":"223883","integrity":{"algorithm":"SHA256","hash":"8d7368d4aebad0514b713191b934993b4f0bf570e1bab93b07dc69712db2cec5","blockSize":4194304,"blocks":["8d7368d4aebad0514b713191b934993b4f0bf570e1bab93b07dc69712db2cec5"]}},"contains.js":{"size":3680,"offset":"224226","integrity":{"algorithm":"SHA256","hash":"56165dc93cd8b0b4611db50a97f1e7d7f9af6c5ffe95a7a5b054d6eeaa7f6a8c","blockSize":4194304,"blocks":["56165dc93cd8b0b4611db50a97f1e7d7f9af6c5ffe95a7a5b054d6eeaa7f6a8c"]}},"dependencies.js":{"size":3198,"offset":"227906","integrity":{"algorithm":"SHA256","hash":"c1a83bf484b6fde4d268935f079ddba5e74a2f589dfc6d15ca2e20ba4d06ee5b","blockSize":4194304,"blocks":["c1a83bf484b6fde4d268935f079ddba5e74a2f589dfc6d15ca2e20ba4d06ee5b"]}},"dependentSchemas.js":{"size":354,"offset":"231104","integrity":{"algorithm":"SHA256","hash":"d17d23755b0cf8699c180dd98b8b7270b688d2e4fe5a4c4fcc53ffdcc18ee58e","blockSize":4194304,"blocks":["d17d23755b0cf8699c180dd98b8b7270b688d2e4fe5a4c4fcc53ffdcc18ee58e"]}},"if.js":{"size":2438,"offset":"231458","integrity":{"algorithm":"SHA256","hash":"42374ee5dc681433579cc689b0c4ae5343f5bf78d4d6a561722b9277c5335ec4","blockSize":4194304,"blocks":["42374ee5dc681433579cc689b0c4ae5343f5bf78d4d6a561722b9277c5335ec4"]}},"index.js":{"size":1529,"offset":"233896","integrity":{"algorithm":"SHA256","hash":"5a61978f6d81bbabfa8b9ccb71d7de816ed6dd1fd7de5c72657439a76c2a7cb3","blockSize":4194304,"blocks":["5a61978f6d81bbabfa8b9ccb71d7de816ed6dd1fd7de5c72657439a76c2a7cb3"]}},"items.js":{"size":1993,"offset":"235425","integrity":{"algorithm":"SHA256","hash":"fa87f74adc3aac1f1b5e3e7dddf73294e6850e1dd49ed131fca4352e9645c54e","blockSize":4194304,"blocks":["fa87f74adc3aac1f1b5e3e7dddf73294e6850e1dd49ed131fca4352e9645c54e"]}},"items2020.js":{"size":1037,"offset":"237418","integrity":{"algorithm":"SHA256","hash":"c449ef64aec16263c7935293ed450cfc2da3ba66f6df5f99c3198c05f169838f","blockSize":4194304,"blocks":["c449ef64aec16263c7935293ed450cfc2da3ba66f6df5f99c3198c05f169838f"]}},"not.js":{"size":773,"offset":"238455","integrity":{"algorithm":"SHA256","hash":"ab2f2758d4ea97ac8763fe5540dd0f4d877859676fe5d6c750a18deca387f718","blockSize":4194304,"blocks":["ab2f2758d4ea97ac8763fe5540dd0f4d877859676fe5d6c750a18deca387f718"]}},"oneOf.js":{"size":2257,"offset":"239228","integrity":{"algorithm":"SHA256","hash":"e2aeb6c22d49fd5f348bedcf7f5c4d7b31f5a05dd7ff1a0c531374c6968792a2","blockSize":4194304,"blocks":["e2aeb6c22d49fd5f348bedcf7f5c4d7b31f5a05dd7ff1a0c531374c6968792a2"]}},"patternProperties.js":{"size":3236,"offset":"241485","integrity":{"algorithm":"SHA256","hash":"0d43da49a82452c439ba990de7372ad5cedb663717918a5f6dae07025abff655","blockSize":4194304,"blocks":["0d43da49a82452c439ba990de7372ad5cedb663717918a5f6dae07025abff655"]}},"prefixItems.js":{"size":354,"offset":"244721","integrity":{"algorithm":"SHA256","hash":"16264f7b3233a6dcb98b48700643efbd3ebc4d11e27b3eacffc83ccb5f44fb23","blockSize":4194304,"blocks":["16264f7b3233a6dcb98b48700643efbd3ebc4d11e27b3eacffc83ccb5f44fb23"]}},"properties.js":{"size":2153,"offset":"245075","integrity":{"algorithm":"SHA256","hash":"c896873ae7251093a2c8880545b69b6e8cb55c44817a53ec830a49818d74104f","blockSize":4194304,"blocks":["c896873ae7251093a2c8880545b69b6e8cb55c44817a53ec830a49818d74104f"]}},"propertyNames.js":{"size":1221,"offset":"247228","integrity":{"algorithm":"SHA256","hash":"b3411cfeaff8efd5e6de12971bb5dc339e64b61fbe62d3b950794c077315c2e7","blockSize":4194304,"blocks":["b3411cfeaff8efd5e6de12971bb5dc339e64b61fbe62d3b950794c077315c2e7"]}},"thenElse.js":{"size":446,"offset":"248449","integrity":{"algorithm":"SHA256","hash":"9bc42eb8699d57188a7ec2a710d3f38052f92bd78c5d4d0442cf98cf2ebbe22d","blockSize":4194304,"blocks":["9bc42eb8699d57188a7ec2a710d3f38052f92bd78c5d4d0442cf98cf2ebbe22d"]}}}},"code.js":{"size":6216,"offset":"248895","integrity":{"algorithm":"SHA256","hash":"9212ddf8bd0a4c3b1c4b44cdadd141183b2b36f561b91d13df53c83911e3bf63","blockSize":4194304,"blocks":["9212ddf8bd0a4c3b1c4b44cdadd141183b2b36f561b91d13df53c83911e3bf63"]}},"core":{"files":{"id.js":{"size":267,"offset":"255111","integrity":{"algorithm":"SHA256","hash":"49c8eff694ce4371450c1f9986e934fcbf4bd143311caef5332113f29175bc11","blockSize":4194304,"blocks":["49c8eff694ce4371450c1f9986e934fcbf4bd143311caef5332113f29175bc11"]}},"index.js":{"size":357,"offset":"255378","integrity":{"algorithm":"SHA256","hash":"f420e1011b95e27b54c58323a7ed4ffbd0a88cdb4496f771bb6782c2aa22d23e","blockSize":4194304,"blocks":["f420e1011b95e27b54c58323a7ed4ffbd0a88cdb4496f771bb6782c2aa22d23e"]}},"ref.js":{"size":5234,"offset":"255735","integrity":{"algorithm":"SHA256","hash":"1422c1454b3621d890066042048f37746fe1cf213088307099816199889bbfd1","blockSize":4194304,"blocks":["1422c1454b3621d890066042048f37746fe1cf213088307099816199889bbfd1"]}}}},"discriminator":{"files":{"index.js":{"size":4845,"offset":"260969","integrity":{"algorithm":"SHA256","hash":"b58b58025d2dbe5a6967376faec9295b860a338664c47037e9a1035c1e8fb88e","blockSize":4194304,"blocks":["b58b58025d2dbe5a6967376faec9295b860a338664c47037e9a1035c1e8fb88e"]}},"types.js":{"size":308,"offset":"265814","integrity":{"algorithm":"SHA256","hash":"2365341d1f30dc72cece7703e908e47aacb8f904b9f66ec4019fe889ae1e57fa","blockSize":4194304,"blocks":["2365341d1f30dc72cece7703e908e47aacb8f904b9f66ec4019fe889ae1e57fa"]}}}},"draft2020.js":{"size":762,"offset":"266122","integrity":{"algorithm":"SHA256","hash":"2d0dc3a14abd48a45ad1407a97f23a0f943fa5244923037f86e95a7de04a7445","blockSize":4194304,"blocks":["2d0dc3a14abd48a45ad1407a97f23a0f943fa5244923037f86e95a7de04a7445"]}},"draft7.js":{"size":557,"offset":"266884","integrity":{"algorithm":"SHA256","hash":"8c62022c6c3aa302c3ea6f6709a697fc9eb6385d243fa7c2156dbe9f02228170","blockSize":4194304,"blocks":["8c62022c6c3aa302c3ea6f6709a697fc9eb6385d243fa7c2156dbe9f02228170"]}},"dynamic":{"files":{"dynamicAnchor.js":{"size":1261,"offset":"267441","integrity":{"algorithm":"SHA256","hash":"78222a5b42bab186253d880f9af4b012394ae5988bfab78e79f2510caed0ccf7","blockSize":4194304,"blocks":["78222a5b42bab186253d880f9af4b012394ae5988bfab78e79f2510caed0ccf7"]}},"dynamicRef.js":{"size":1985,"offset":"268702","integrity":{"algorithm":"SHA256","hash":"acc2913c91d11ff57150dde1751cdd5d9f486a0cb156037870ede203273af917","blockSize":4194304,"blocks":["acc2913c91d11ff57150dde1751cdd5d9f486a0cb156037870ede203273af917"]}},"index.js":{"size":457,"offset":"270687","integrity":{"algorithm":"SHA256","hash":"8c05d09948653957427f351d9c6172965b932a5663f7dcb63014a491a533cc0b","blockSize":4194304,"blocks":["8c05d09948653957427f351d9c6172965b932a5663f7dcb63014a491a533cc0b"]}},"recursiveAnchor.js":{"size":522,"offset":"271144","integrity":{"algorithm":"SHA256","hash":"9f6cb7e509f9deada1b884010f08c52876f8eace32dcf0e7da28f6d0d91f3f76","blockSize":4194304,"blocks":["9f6cb7e509f9deada1b884010f08c52876f8eace32dcf0e7da28f6d0d91f3f76"]}},"recursiveRef.js":{"size":325,"offset":"271666","integrity":{"algorithm":"SHA256","hash":"7b0c651e2c5b5218639cd3ad7e5162f1e226fc9814107a85f4c3e47f5138670d","blockSize":4194304,"blocks":["7b0c651e2c5b5218639cd3ad7e5162f1e226fc9814107a85f4c3e47f5138670d"]}}}},"errors.js":{"size":111,"offset":"271991","integrity":{"algorithm":"SHA256","hash":"7758b311e7cba27a8ff8b99a5fcd8db6804265cbc48d2867b72bfe56823d36bc","blockSize":4194304,"blocks":["7758b311e7cba27a8ff8b99a5fcd8db6804265cbc48d2867b72bfe56823d36bc"]}},"format":{"files":{"format.js":{"size":4317,"offset":"272102","integrity":{"algorithm":"SHA256","hash":"6fae0d5124fd821b1a9959492f7d6d7b528bee8830d49a7a4759fc9a9ab81d5f","blockSize":4194304,"blocks":["6fae0d5124fd821b1a9959492f7d6d7b528bee8830d49a7a4759fc9a9ab81d5f"]}},"index.js":{"size":209,"offset":"276419","integrity":{"algorithm":"SHA256","hash":"d5dad5f95c9c5f48f8ca956cdbb927aafc7b56baabfca8c0b0403d92c5ebeb67","blockSize":4194304,"blocks":["d5dad5f95c9c5f48f8ca956cdbb927aafc7b56baabfca8c0b0403d92c5ebeb67"]}}}},"jtd":{"files":{"discriminator.js":{"size":2785,"offset":"276628","integrity":{"algorithm":"SHA256","hash":"14df845b5ef760d96a3c62db8d4446840e3d408a248d1b92ba6db2260fca4da2","blockSize":4194304,"blocks":["14df845b5ef760d96a3c62db8d4446840e3d408a248d1b92ba6db2260fca4da2"]}},"elements.js":{"size":949,"offset":"279413","integrity":{"algorithm":"SHA256","hash":"b2cad5c59d7c8ce936cea240d70beb41404c729901a60f32013c4facdcacfd5b","blockSize":4194304,"blocks":["b2cad5c59d7c8ce936cea240d70beb41404c729901a60f32013c4facdcacfd5b"]}},"enum.js":{"size":1745,"offset":"280362","integrity":{"algorithm":"SHA256","hash":"4a8b7fa05f94b2e67275445c6e8437c337b92f709d243ed30a48ba6a08a9a154","blockSize":4194304,"blocks":["4a8b7fa05f94b2e67275445c6e8437c337b92f709d243ed30a48ba6a08a9a154"]}},"error.js":{"size":893,"offset":"282107","integrity":{"algorithm":"SHA256","hash":"d6896337eedc9b71a742912f776580918cb4de58a90b434cd39f152896da16f9","blockSize":4194304,"blocks":["d6896337eedc9b71a742912f776580918cb4de58a90b434cd39f152896da16f9"]}},"index.js":{"size":962,"offset":"283000","integrity":{"algorithm":"SHA256","hash":"c57d340cd0709479d8ea9f102549a8fd2a47a2c1f2e6fe7f0e14067fe6385d7d","blockSize":4194304,"blocks":["c57d340cd0709479d8ea9f102549a8fd2a47a2c1f2e6fe7f0e14067fe6385d7d"]}},"metadata.js":{"size":810,"offset":"283962","integrity":{"algorithm":"SHA256","hash":"237a4bcc04f1a59628ba35aab9bd7c02fa19a007bf026f75c562c20c7a63ab68","blockSize":4194304,"blocks":["237a4bcc04f1a59628ba35aab9bd7c02fa19a007bf026f75c562c20c7a63ab68"]}},"nullable.js":{"size":859,"offset":"284772","integrity":{"algorithm":"SHA256","hash":"ba6494ac04fb1c2654951e8c8a57861e324fafa0f6c3bd2e1716bea8eb5c823a","blockSize":4194304,"blocks":["ba6494ac04fb1c2654951e8c8a57861e324fafa0f6c3bd2e1716bea8eb5c823a"]}},"optionalProperties.js":{"size":436,"offset":"285631","integrity":{"algorithm":"SHA256","hash":"82b67841649a948b069c8e0cfab712eb883579690065a05658b7df7e4eddcc62","blockSize":4194304,"blocks":["82b67841649a948b069c8e0cfab712eb883579690065a05658b7df7e4eddcc62"]}},"properties.js":{"size":6320,"offset":"286067","integrity":{"algorithm":"SHA256","hash":"4a392193b708f69c25511ed059e80a70ea084585731817ad8e459364f479eb35","blockSize":4194304,"blocks":["4a392193b708f69c25511ed059e80a70ea084585731817ad8e459364f479eb35"]}},"ref.js":{"size":2648,"offset":"292387","integrity":{"algorithm":"SHA256","hash":"4736880c610f3664a8c714fdb5cf4e9db9fcda1721691dcacad2e9796e937460","blockSize":4194304,"blocks":["4736880c610f3664a8c714fdb5cf4e9db9fcda1721691dcacad2e9796e937460"]}},"type.js":{"size":2706,"offset":"295035","integrity":{"algorithm":"SHA256","hash":"f97e19f2c3042938f433cfad0c4500b3342d869719550246bd4fced479db8e1c","blockSize":4194304,"blocks":["f97e19f2c3042938f433cfad0c4500b3342d869719550246bd4fced479db8e1c"]}},"union.js":{"size":343,"offset":"297741","integrity":{"algorithm":"SHA256","hash":"f8404ab539ecfc5f6eb1bc489cc541aad6bf79cf58beecfcfe671226678c3280","blockSize":4194304,"blocks":["f8404ab539ecfc5f6eb1bc489cc541aad6bf79cf58beecfcfe671226678c3280"]}},"values.js":{"size":1838,"offset":"298084","integrity":{"algorithm":"SHA256","hash":"6b98eb1fbe2686a7f26fbf1e8860f61bdc81fe47117c4f5a79d5ca1fc92138f2","blockSize":4194304,"blocks":["6b98eb1fbe2686a7f26fbf1e8860f61bdc81fe47117c4f5a79d5ca1fc92138f2"]}}}},"metadata.js":{"size":427,"offset":"299922","integrity":{"algorithm":"SHA256","hash":"45c178744a7ec57e20c85ceeaea8d9f36b5663636ab7e495ea2c3c1bf4a58609","blockSize":4194304,"blocks":["45c178744a7ec57e20c85ceeaea8d9f36b5663636ab7e495ea2c3c1bf4a58609"]}},"next.js":{"size":433,"offset":"300349","integrity":{"algorithm":"SHA256","hash":"491c4d9738e50a6c22b3090cb1df49911b4bb7c3b7dcafc2f2dd4c074c4d82e7","blockSize":4194304,"blocks":["491c4d9738e50a6c22b3090cb1df49911b4bb7c3b7dcafc2f2dd4c074c4d82e7"]}},"unevaluated":{"files":{"index.js":{"size":350,"offset":"300782","integrity":{"algorithm":"SHA256","hash":"4e7936d1a55051e70e2ebbbfc8de94fbe7f1e7b055252df5a984481ea7c156a4","blockSize":4194304,"blocks":["4e7936d1a55051e70e2ebbbfc8de94fbe7f1e7b055252df5a984481ea7c156a4"]}},"unevaluatedItems.js":{"size":1588,"offset":"301132","integrity":{"algorithm":"SHA256","hash":"4d7010c39f1b7af4a2fe1a62e5b65c8f763d4e58ac3d710099d367659f5e4fda","blockSize":4194304,"blocks":["4d7010c39f1b7af4a2fe1a62e5b65c8f763d4e58ac3d710099d367659f5e4fda"]}},"unevaluatedProperties.js":{"size":2608,"offset":"302720","integrity":{"algorithm":"SHA256","hash":"665029a99612ec32e9bef99c9c4b09a4dc0be6c71d7b920594d414d404806ebe","blockSize":4194304,"blocks":["665029a99612ec32e9bef99c9c4b09a4dc0be6c71d7b920594d414d404806ebe"]}}}},"validation":{"files":{"const.js":{"size":852,"offset":"305328","integrity":{"algorithm":"SHA256","hash":"ace994e9ab97a70899a9484794794f4be5ee03bfb3cf32242d3f091d77f0329a","blockSize":4194304,"blocks":["ace994e9ab97a70899a9484794794f4be5ee03bfb3cf32242d3f091d77f0329a"]}},"dependentRequired.js":{"size":403,"offset":"306180","integrity":{"algorithm":"SHA256","hash":"cd69a90089328b24d2232c12edae57858c14f66aaa56923c12929eb3d673e8fa","blockSize":4194304,"blocks":["cd69a90089328b24d2232c12edae57858c14f66aaa56923c12929eb3d673e8fa"]}},"enum.js":{"size":1901,"offset":"306583","integrity":{"algorithm":"SHA256","hash":"61062b318a40eb52fc5a8283e7f4781db98349841744961ef4fe04a4722ebf22","blockSize":4194304,"blocks":["61062b318a40eb52fc5a8283e7f4781db98349841744961ef4fe04a4722ebf22"]}},"index.js":{"size":1036,"offset":"308484","integrity":{"algorithm":"SHA256","hash":"4a1839832de5f10ff423c1c0c6cb232b5b6e1b34980a28862cf56b2763136de4","blockSize":4194304,"blocks":["4a1839832de5f10ff423c1c0c6cb232b5b6e1b34980a28862cf56b2763136de4"]}},"limitContains.js":{"size":495,"offset":"309520","integrity":{"algorithm":"SHA256","hash":"0ea6f2e43359add298e1ed9306fe5020c62e086392f2915f10226b01394b200d","blockSize":4194304,"blocks":["0ea6f2e43359add298e1ed9306fe5020c62e086392f2915f10226b01394b200d"]}},"limitItems.js":{"size":852,"offset":"310015","integrity":{"algorithm":"SHA256","hash":"49f0427d29b38aef2fa8aead26e68bda12deb9a2da22f7a7804ba0fed44e1fec","blockSize":4194304,"blocks":["49f0427d29b38aef2fa8aead26e68bda12deb9a2da22f7a7804ba0fed44e1fec"]}},"limitLength.js":{"size":1130,"offset":"310867","integrity":{"algorithm":"SHA256","hash":"379c28317faaf7784680b6049c3562692d3df6d65cce33f48e6c6c723beeeec2","blockSize":4194304,"blocks":["379c28317faaf7784680b6049c3562692d3df6d65cce33f48e6c6c723beeeec2"]}},"limitNumber.js":{"size":1036,"offset":"311997","integrity":{"algorithm":"SHA256","hash":"3dd4bd41dbfc76c522078ff54b6479683485c4e97faa04cfcfaf2d8cb0fb8e65","blockSize":4194304,"blocks":["3dd4bd41dbfc76c522078ff54b6479683485c4e97faa04cfcfaf2d8cb0fb8e65"]}},"limitProperties.js":{"size":896,"offset":"313033","integrity":{"algorithm":"SHA256","hash":"8523a3f7b36c34882ca32b0ec71a2157d7930907cb86b778a97c1514fa6258ac","blockSize":4194304,"blocks":["8523a3f7b36c34882ca32b0ec71a2157d7930907cb86b778a97c1514fa6258ac"]}},"multipleOf.js":{"size":1023,"offset":"313929","integrity":{"algorithm":"SHA256","hash":"df128c2a6ca74ae57c65fbfe3aea8a101447a3ae8c41fd53cfc5693fa23cc8bd","blockSize":4194304,"blocks":["df128c2a6ca74ae57c65fbfe3aea8a101447a3ae8c41fd53cfc5693fa23cc8bd"]}},"pattern.js":{"size":1323,"offset":"314952","integrity":{"algorithm":"SHA256","hash":"86e84206bfc6a66ef18bf1fe43fbc56ebe7f7f4d57841197b6d044c529e0c195","blockSize":4194304,"blocks":["86e84206bfc6a66ef18bf1fe43fbc56ebe7f7f4d57841197b6d044c529e0c195"]}},"required.js":{"size":3188,"offset":"316275","integrity":{"algorithm":"SHA256","hash":"b953bc18d94274bd73374dd5b4282d7a21159cec8c0e7a357e1eaf3f326b9054","blockSize":4194304,"blocks":["b953bc18d94274bd73374dd5b4282d7a21159cec8c0e7a357e1eaf3f326b9054"]}},"uniqueItems.js":{"size":3037,"offset":"319463","integrity":{"algorithm":"SHA256","hash":"666d1a2aa25c0dfe3cf41312d0f9d40e9f99eb2c19be7469134ad89005aadd52","blockSize":4194304,"blocks":["666d1a2aa25c0dfe3cf41312d0f9d40e9f99eb2c19be7469134ad89005aadd52"]}}}}}}}},"lib":{"files":{"refs":{"files":{"data.json":{"size":409,"offset":"322500","integrity":{"algorithm":"SHA256","hash":"d24ab8a97c18b3f5afdde7d7024a0e0ac1df0614a16a41cb88f81379edcc2db3","blockSize":4194304,"blocks":["d24ab8a97c18b3f5afdde7d7024a0e0ac1df0614a16a41cb88f81379edcc2db3"]}},"json-schema-2019-09":{"files":{"meta":{"files":{"applicator.json":{"size":1566,"offset":"322909","integrity":{"algorithm":"SHA256","hash":"9c356a52b0ad5da7d4c1b69f61dff5277c2af46221bc0b0521bbdbf3a12d3a2a","blockSize":4194304,"blocks":["9c356a52b0ad5da7d4c1b69f61dff5277c2af46221bc0b0521bbdbf3a12d3a2a"]}},"content.json":{"size":477,"offset":"324475","integrity":{"algorithm":"SHA256","hash":"cf4792ae93f4a4580ec9523640945f7756f75fd624935ebf15194b0ac3909267","blockSize":4194304,"blocks":["cf4792ae93f4a4580ec9523640945f7756f75fd624935ebf15194b0ac3909267"]}},"core.json":{"size":1273,"offset":"324952","integrity":{"algorithm":"SHA256","hash":"629c017994ffaa33f573a96cf01b9dac6cae80c7d5d17dad5e823a3afa18d5fe","blockSize":4194304,"blocks":["629c017994ffaa33f573a96cf01b9dac6cae80c7d5d17dad5e823a3afa18d5fe"]}},"format.json":{"size":375,"offset":"326225","integrity":{"algorithm":"SHA256","hash":"018ef7c81bcca9e40a4a02ed236e7cabb3a630f2b1ea01fbdeed2f882c15ddc8","blockSize":4194304,"blocks":["018ef7c81bcca9e40a4a02ed236e7cabb3a630f2b1ea01fbdeed2f882c15ddc8"]}},"meta-data.json":{"size":758,"offset":"326600","integrity":{"algorithm":"SHA256","hash":"e038593d36bf1855875a13b8812469d6a2d62ed309436b9c9a2fa5a4ba59085e","blockSize":4194304,"blocks":["e038593d36bf1855875a13b8812469d6a2d62ed309436b9c9a2fa5a4ba59085e"]}},"validation.json":{"size":2264,"offset":"327358","integrity":{"algorithm":"SHA256","hash":"aaba7f2d6fcbdfa6ca97fdc3d3da1ae7d66ca3322b7e90cf5a98b067555d06e6","blockSize":4194304,"blocks":["aaba7f2d6fcbdfa6ca97fdc3d3da1ae7d66ca3322b7e90cf5a98b067555d06e6"]}}}},"schema.json":{"size":1579,"offset":"329622","integrity":{"algorithm":"SHA256","hash":"264720afa0dd61919e21bbe9bc1312121b70e43019ac696240e069adc72cce15","blockSize":4194304,"blocks":["264720afa0dd61919e21bbe9bc1312121b70e43019ac696240e069adc72cce15"]}}}},"json-schema-2020-12":{"files":{"meta":{"files":{"applicator.json":{"size":1441,"offset":"331201","integrity":{"algorithm":"SHA256","hash":"f1e465ff0c0cc86bee5c0cc4b51d2734c532e6ea12c75b60a2ac093a4577b2d4","blockSize":4194304,"blocks":["f1e465ff0c0cc86bee5c0cc4b51d2734c532e6ea12c75b60a2ac093a4577b2d4"]}},"content.json":{"size":479,"offset":"332642","integrity":{"algorithm":"SHA256","hash":"7ede86f2c48d646202bf1332aefaf46db268c943d59752727db7247dc2920516","blockSize":4194304,"blocks":["7ede86f2c48d646202bf1332aefaf46db268c943d59752727db7247dc2920516"]}},"core.json":{"size":1344,"offset":"333121","integrity":{"algorithm":"SHA256","hash":"c3a5947992d4fe67c95cda7910911207376bbae41c0a124ec9e7e699172e7a49","blockSize":4194304,"blocks":["c3a5947992d4fe67c95cda7910911207376bbae41c0a124ec9e7e699172e7a49"]}},"format-annotation.json":{"size":420,"offset":"334465","integrity":{"algorithm":"SHA256","hash":"1e31131b1ed21f98c007f04deb501343b8c4dd77f1c5a8494a9c2085f68d769d","blockSize":4194304,"blocks":["1e31131b1ed21f98c007f04deb501343b8c4dd77f1c5a8494a9c2085f68d769d"]}},"meta-data.json":{"size":758,"offset":"334885","integrity":{"algorithm":"SHA256","hash":"eb008c756b29bdaa237c1f06d32ea4a21f6ef22148b03c6372cea5e4c0782273","blockSize":4194304,"blocks":["eb008c756b29bdaa237c1f06d32ea4a21f6ef22148b03c6372cea5e4c0782273"]}},"unevaluated.json":{"size":472,"offset":"335643","integrity":{"algorithm":"SHA256","hash":"8f7f75f4274745faa32e4abdba12de99f49b21df225f52f723b5c62043b0edca","blockSize":4194304,"blocks":["8f7f75f4274745faa32e4abdba12de99f49b21df225f52f723b5c62043b0edca"]}},"validation.json":{"size":2264,"offset":"336115","integrity":{"algorithm":"SHA256","hash":"3cae7069843679429e4ada7df261bb8961fa34cac15be89296026e69af312092","blockSize":4194304,"blocks":["3cae7069843679429e4ada7df261bb8961fa34cac15be89296026e69af312092"]}}}},"schema.json":{"size":2166,"offset":"338379","integrity":{"algorithm":"SHA256","hash":"5333c7df76bceee098e865881d0808238dea836126c6c60b49299ec85c6c7a56","blockSize":4194304,"blocks":["5333c7df76bceee098e865881d0808238dea836126c6c60b49299ec85c6c7a56"]}}}},"json-schema-draft-06.json":{"size":3449,"offset":"340545","integrity":{"algorithm":"SHA256","hash":"a9b6a00af20105009f0924cd7c02d811bbf70c579a96f1552579c3457111f687","blockSize":4194304,"blocks":["a9b6a00af20105009f0924cd7c02d811bbf70c579a96f1552579c3457111f687"]}},"json-schema-draft-07.json":{"size":3811,"offset":"343994","integrity":{"algorithm":"SHA256","hash":"f7e8b13cad4fecff9771f3626fef33e20e59027b90938a28fd9d2f6c17cd0773","blockSize":4194304,"blocks":["f7e8b13cad4fecff9771f3626fef33e20e59027b90938a28fd9d2f6c17cd0773"]}},"json-schema-secure.json":{"size":2521,"offset":"347805","integrity":{"algorithm":"SHA256","hash":"b7840b4f1526eee47ac19780906a436d0c39df2aa3d505388caf18864085a421","blockSize":4194304,"blocks":["b7840b4f1526eee47ac19780906a436d0c39df2aa3d505388caf18864085a421"]}}}}}},"package.json":{"size":2278,"offset":"350326","integrity":{"algorithm":"SHA256","hash":"2baf8c33593ddcc48442d31aa027e3024ca7a612adf144f713a7aa5ccdb70953","blockSize":4194304,"blocks":["2baf8c33593ddcc48442d31aa027e3024ca7a612adf144f713a7aa5ccdb70953"]}}}},"ajv-formats":{"files":{"LICENSE":{"size":1074,"offset":"352604","integrity":{"algorithm":"SHA256","hash":"9df3bb69929a3b650ed73b3bfa1756725aaff0ac296461605753547004eafeaf","blockSize":4194304,"blocks":["9df3bb69929a3b650ed73b3bfa1756725aaff0ac296461605753547004eafeaf"]}},"dist":{"files":{"formats.js":{"size":10870,"offset":"353678","integrity":{"algorithm":"SHA256","hash":"0970043fe6605b30a696562ff8f1ff621eff5f1250f961a92668db8ad9d0cf8c","blockSize":4194304,"blocks":["0970043fe6605b30a696562ff8f1ff621eff5f1250f961a92668db8ad9d0cf8c"]}},"index.js":{"size":1498,"offset":"364548","integrity":{"algorithm":"SHA256","hash":"25ae29038da0fd1021a623de0db504f2eff2d2e1fed832f3a41b795833182dde","blockSize":4194304,"blocks":["25ae29038da0fd1021a623de0db504f2eff2d2e1fed832f3a41b795833182dde"]}},"limit.js":{"size":2850,"offset":"366046","integrity":{"algorithm":"SHA256","hash":"8ed43a480952d8aa1afa2da3c41450cadf9a39995be7c4e0e54cd75a9c373944","blockSize":4194304,"blocks":["8ed43a480952d8aa1afa2da3c41450cadf9a39995be7c4e0e54cd75a9c373944"]}}}},"package.json":{"size":1307,"offset":"368896","integrity":{"algorithm":"SHA256","hash":"ca76c549d158d201b424ecf63eb28474173da2d8cb8c8266ba06a2ee19f9d669","blockSize":4194304,"blocks":["ca76c549d158d201b424ecf63eb28474173da2d8cb8c8266ba06a2ee19f9d669"]}}}},"atomically":{"files":{".editorconfig":{"size":189,"offset":"370203","integrity":{"algorithm":"SHA256","hash":"42a82ef9e641f12b19ae3919e6fe8ef14f9c4c3b4185df730a82d04300b4620e","blockSize":4194304,"blocks":["42a82ef9e641f12b19ae3919e6fe8ef14f9c4c3b4185df730a82d04300b4620e"]}},".nvmrc":{"size":9,"offset":"370392","integrity":{"algorithm":"SHA256","hash":"890a9ba685b9cb0ecf37267be4c5b5f76a404598d26897d9b0ab9b95c3fc308b","blockSize":4194304,"blocks":["890a9ba685b9cb0ecf37267be4c5b5f76a404598d26897d9b0ab9b95c3fc308b"]}},"LICENSE":{"size":1091,"offset":"370401","integrity":{"algorithm":"SHA256","hash":"716bd9213ef82d9017ed813688703837aaa99fc56de205a7b97475d40056a500","blockSize":4194304,"blocks":["716bd9213ef82d9017ed813688703837aaa99fc56de205a7b97475d40056a500"]}},"dist":{"files":{"consts.js":{"size":1572,"offset":"371492","integrity":{"algorithm":"SHA256","hash":"feb31cc92d3c258df9008e9584d74362e661cac42ad6abb4cc305ff2d7432337","blockSize":4194304,"blocks":["feb31cc92d3c258df9008e9584d74362e661cac42ad6abb4cc305ff2d7432337"]}},"index.js":{"size":7780,"offset":"373064","integrity":{"algorithm":"SHA256","hash":"95c30ea2977ce45e25f8b42ae64b58f8c90543cbd9763c828f6170e554ff680a","blockSize":4194304,"blocks":["95c30ea2977ce45e25f8b42ae64b58f8c90543cbd9763c828f6170e554ff680a"]}},"types.js":{"size":89,"offset":"380844","integrity":{"algorithm":"SHA256","hash":"b4435decae0d0ea87851e7cdd3139043de0246a78302b6f355e5b059b50e6553","blockSize":4194304,"blocks":["b4435decae0d0ea87851e7cdd3139043de0246a78302b6f355e5b059b50e6553"]}},"utils":{"files":{"attemptify.js":{"size":788,"offset":"380933","integrity":{"algorithm":"SHA256","hash":"f570e6c261b2c413992073e48023163b21afb5f4cf1ad7ee2d230566595ddf82","blockSize":4194304,"blocks":["f570e6c261b2c413992073e48023163b21afb5f4cf1ad7ee2d230566595ddf82"]}},"fs.js":{"size":3037,"offset":"381721","integrity":{"algorithm":"SHA256","hash":"b15a3ea242de95a06402dd37172412553e481c67f7cd9bbaf4f8a3edeaca52e6","blockSize":4194304,"blocks":["b15a3ea242de95a06402dd37172412553e481c67f7cd9bbaf4f8a3edeaca52e6"]}},"fs_handlers.js":{"size":865,"offset":"384758","integrity":{"algorithm":"SHA256","hash":"b7cb366f755bb3297cf90797a6b0db7a1c7c0e23f2350eb09cffb16eecab16d9","blockSize":4194304,"blocks":["b7cb366f755bb3297cf90797a6b0db7a1c7c0e23f2350eb09cffb16eecab16d9"]}},"lang.js":{"size":356,"offset":"385623","integrity":{"algorithm":"SHA256","hash":"e84c44f703058eca395c41920501b3c450de15d687e1b509716fcda3e029d822","blockSize":4194304,"blocks":["e84c44f703058eca395c41920501b3c450de15d687e1b509716fcda3e029d822"]}},"retryify.js":{"size":1653,"offset":"385979","integrity":{"algorithm":"SHA256","hash":"2bd96d6f5af98a990f6774f28a943a2126d98df3bd66e25eb5bc546ac12b7338","blockSize":4194304,"blocks":["2bd96d6f5af98a990f6774f28a943a2126d98df3bd66e25eb5bc546ac12b7338"]}},"retryify_queue.js":{"size":1836,"offset":"387632","integrity":{"algorithm":"SHA256","hash":"9b6e5ad524ac9f29d9fab8fe740b660caebf54f0da7554541c8edb4c74710951","blockSize":4194304,"blocks":["9b6e5ad524ac9f29d9fab8fe740b660caebf54f0da7554541c8edb4c74710951"]}},"scheduler.js":{"size":860,"offset":"389468","integrity":{"algorithm":"SHA256","hash":"f32626546190ecb8dd54cdf66ccf6a82f17b23efb8d287ed656e189086b34de6","blockSize":4194304,"blocks":["f32626546190ecb8dd54cdf66ccf6a82f17b23efb8d287ed656e189086b34de6"]}},"temp.js":{"size":2458,"offset":"390328","integrity":{"algorithm":"SHA256","hash":"f4dad31de0b8d678dacbf7b6ee0f182575dc6555871a42a3a73506f9c37090b5","blockSize":4194304,"blocks":["f4dad31de0b8d678dacbf7b6ee0f182575dc6555871a42a3a73506f9c37090b5"]}}}}}},"package.json":{"size":793,"offset":"392786","integrity":{"algorithm":"SHA256","hash":"119eab3c437e45dd45e6c67a2ecf8009511675c7803bc1baca07b1f52a7809f8","blockSize":4194304,"blocks":["119eab3c437e45dd45e6c67a2ecf8009511675c7803bc1baca07b1f52a7809f8"]},"executable":true},"tasks":{"files":{"benchmark.js":{"size":2747,"offset":"393579","integrity":{"algorithm":"SHA256","hash":"988ecbd8462edfc5867759fc55613c0d90462d43b54078b13124b0301be040ce","blockSize":4194304,"blocks":["988ecbd8462edfc5867759fc55613c0d90462d43b54078b13124b0301be040ce"]}}}},"tsconfig.json":{"size":687,"offset":"396326","integrity":{"algorithm":"SHA256","hash":"be665bb12b0c8433412ccc07afdcffbb5cd4b5770a028ff39067cb177c4f85d0","blockSize":4194304,"blocks":["be665bb12b0c8433412ccc07afdcffbb5cd4b5770a028ff39067cb177c4f85d0"]},"executable":true}}},"conf":{"files":{"dist":{"files":{"source":{"files":{"index.js":{"size":20779,"offset":"397013","integrity":{"algorithm":"SHA256","hash":"bb9f43d6800ae8a54239dffdb4d8bf9532a3620454d2195762e91daf4303e586","blockSize":4194304,"blocks":["bb9f43d6800ae8a54239dffdb4d8bf9532a3620454d2195762e91daf4303e586"]}},"types.js":{"size":77,"offset":"417792","integrity":{"algorithm":"SHA256","hash":"d43aa81f5bc89faa359e0f97c814ba25155591ff078fbb9bfd40f8c7c9683230","blockSize":4194304,"blocks":["d43aa81f5bc89faa359e0f97c814ba25155591ff078fbb9bfd40f8c7c9683230"]}}}}}},"license":{"size":1117,"offset":"417869","integrity":{"algorithm":"SHA256","hash":"5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3","blockSize":4194304,"blocks":["5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3"]}},"package.json":{"size":1233,"offset":"418986","integrity":{"algorithm":"SHA256","hash":"c4bc0707fe539ef6b2f4dd240329bc6cddcf0051209a79eb79a41bf4d331bd12","blockSize":4194304,"blocks":["c4bc0707fe539ef6b2f4dd240329bc6cddcf0051209a79eb79a41bf4d331bd12"]}}}},"debounce-fn":{"files":{"index.js":{"size":1080,"offset":"420219","integrity":{"algorithm":"SHA256","hash":"c9b8c0476e48445718d35a34c18dae9eb7b07f63e84cb827f4eeb26c13508ea6","blockSize":4194304,"blocks":["c9b8c0476e48445718d35a34c18dae9eb7b07f63e84cb827f4eeb26c13508ea6"]}},"license":{"size":1117,"offset":"421299","integrity":{"algorithm":"SHA256","hash":"5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3","blockSize":4194304,"blocks":["5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3"]}},"package.json":{"size":589,"offset":"422416","integrity":{"algorithm":"SHA256","hash":"659179dad80757bfed72bb36a4684c777960279aae9f8b53e245bd71e67ce661","blockSize":4194304,"blocks":["659179dad80757bfed72bb36a4684c777960279aae9f8b53e245bd71e67ce661"]}}}},"dot-prop":{"files":{"index.js":{"size":2705,"offset":"423005","integrity":{"algorithm":"SHA256","hash":"9f475c2dcec98af9a2b7fa5017f09e734808aa0c1c8c61ac38ad161764b47c65","blockSize":4194304,"blocks":["9f475c2dcec98af9a2b7fa5017f09e734808aa0c1c8c61ac38ad161764b47c65"]}},"license":{"size":1117,"offset":"425710","integrity":{"algorithm":"SHA256","hash":"5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3","blockSize":4194304,"blocks":["5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3"]}},"package.json":{"size":634,"offset":"426827","integrity":{"algorithm":"SHA256","hash":"db15174cbb71d9836de1ace1c959bd2a83e54fee14cf34446ddfd469e74fad78","blockSize":4194304,"blocks":["db15174cbb71d9836de1ace1c959bd2a83e54fee14cf34446ddfd469e74fad78"]}}}},"electron-store":{"files":{"index.js":{"size":1869,"offset":"427461","integrity":{"algorithm":"SHA256","hash":"addc2492877598e1f510627408578aef5087b63897c15d79d928f0cc7c762f22","blockSize":4194304,"blocks":["addc2492877598e1f510627408578aef5087b63897c15d79d928f0cc7c762f22"]}},"license":{"size":1117,"offset":"429330","integrity":{"algorithm":"SHA256","hash":"5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3","blockSize":4194304,"blocks":["5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3"]}},"package.json":{"size":721,"offset":"430447","integrity":{"algorithm":"SHA256","hash":"1d31c5380e311f73e43b32648aedcf5e96c13d148df4dd0ce426e2543ffc7f98","blockSize":4194304,"blocks":["1d31c5380e311f73e43b32648aedcf5e96c13d148df4dd0ce426e2543ffc7f98"]}}}},"env-paths":{"files":{"index.js":{"size":2155,"offset":"431168","integrity":{"algorithm":"SHA256","hash":"84351667051b005f9856319267407b06affad12888355462c7c8740f22ca3999","blockSize":4194304,"blocks":["84351667051b005f9856319267407b06affad12888355462c7c8740f22ca3999"]}},"license":{"size":1109,"offset":"433323","integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]}},"package.json":{"size":484,"offset":"434432","integrity":{"algorithm":"SHA256","hash":"de9602e1b482b8748b5550711f10f24fcc73d916806e1db497876fb2842ae6ba","blockSize":4194304,"blocks":["de9602e1b482b8748b5550711f10f24fcc73d916806e1db497876fb2842ae6ba"]}}}},"fast-deep-equal":{"files":{"LICENSE":{"size":1074,"offset":"434916","integrity":{"algorithm":"SHA256","hash":"7bf9b2de73a6b356761c948d0e9eeb4be6c1270bd04c79cd489c1e400ffdfc1a","blockSize":4194304,"blocks":["7bf9b2de73a6b356761c948d0e9eeb4be6c1270bd04c79cd489c1e400ffdfc1a"]}},"es6":{"files":{"index.js":{"size":1935,"offset":"435990","integrity":{"algorithm":"SHA256","hash":"d7f027497048c75e17268dbc66b670579d4f70f2dc0e019cdc9edf5078c247d6","blockSize":4194304,"blocks":["d7f027497048c75e17268dbc66b670579d4f70f2dc0e019cdc9edf5078c247d6"]}},"react.js":{"size":2209,"offset":"437925","integrity":{"algorithm":"SHA256","hash":"366779cbb7821d26d18b9eaa12b6788cbb101cdbbabcae36f2919a5f48534ef0","blockSize":4194304,"blocks":["366779cbb7821d26d18b9eaa12b6788cbb101cdbbabcae36f2919a5f48534ef0"]}}}},"index.js":{"size":1177,"offset":"440134","integrity":{"algorithm":"SHA256","hash":"eb469e206280321a3878f2335ec98aa2104a155079d8ed83a23029098dccd215","blockSize":4194304,"blocks":["eb469e206280321a3878f2335ec98aa2104a155079d8ed83a23029098dccd215"]}},"package.json":{"size":754,"offset":"441311","integrity":{"algorithm":"SHA256","hash":"8364d2abc7912ad54eba3447f9da67767652c15bd65c0f7b7f35646bb4556758","blockSize":4194304,"blocks":["8364d2abc7912ad54eba3447f9da67767652c15bd65c0f7b7f35646bb4556758"]}},"react.js":{"size":1451,"offset":"442065","integrity":{"algorithm":"SHA256","hash":"37cbd168dbd42c73119ce7326556bddef40b3a5fbd2e215cf81a7c78fb73ff9a","blockSize":4194304,"blocks":["37cbd168dbd42c73119ce7326556bddef40b3a5fbd2e215cf81a7c78fb73ff9a"]}}}},"fast-uri":{"files":{"LICENSE":{"size":1852,"offset":"443516","integrity":{"algorithm":"SHA256","hash":"185ef4f377743572c2bf0931f741fae52401268cbe70c880b74063799814083e","blockSize":4194304,"blocks":["185ef4f377743572c2bf0931f741fae52401268cbe70c880b74063799814083e"]}},"benchmark":{"files":{"benchmark.mjs":{"size":4421,"offset":"445368","integrity":{"algorithm":"SHA256","hash":"45ba9783c3258e448b05bd371161ef9fcbeed332ba1e9455ca9c98edb24e1f33","blockSize":4194304,"blocks":["45ba9783c3258e448b05bd371161ef9fcbeed332ba1e9455ca9c98edb24e1f33"]}},"equal.mjs":{"size":1305,"offset":"449789","integrity":{"algorithm":"SHA256","hash":"36eb5b2acea9c4e969ab8fe028e88b781aa948e597368655a13528c3a93f1d39","blockSize":4194304,"blocks":["36eb5b2acea9c4e969ab8fe028e88b781aa948e597368655a13528c3a93f1d39"]}},"non-simple-domain.mjs":{"size":838,"offset":"451094","integrity":{"algorithm":"SHA256","hash":"303eb41faa6c2489b5086f3d2764bf6ecaf3b937b385647c6e8b14aaf2582524","blockSize":4194304,"blocks":["303eb41faa6c2489b5086f3d2764bf6ecaf3b937b385647c6e8b14aaf2582524"]}},"package.json":{"size":220,"offset":"451932","integrity":{"algorithm":"SHA256","hash":"7e88fa1a8044e61f8784ba64266d4d097b878867cf3b9d82fa13ea6f2022e310","blockSize":4194304,"blocks":["7e88fa1a8044e61f8784ba64266d4d097b878867cf3b9d82fa13ea6f2022e310"]}},"string-array-to-hex-stripped.mjs":{"size":819,"offset":"452152","integrity":{"algorithm":"SHA256","hash":"693d4a312b0e275e02ef5531d707ff7df6cddf14cd83bc09a79909ea2008bfd4","blockSize":4194304,"blocks":["693d4a312b0e275e02ef5531d707ff7df6cddf14cd83bc09a79909ea2008bfd4"]}},"ws-is-secure.mjs":{"size":1891,"offset":"452971","integrity":{"algorithm":"SHA256","hash":"6f105dc633aadd4bd4b8362765f4a1d44fb31fe0c8754cb11d73f27ff7d6527b","blockSize":4194304,"blocks":["6f105dc633aadd4bd4b8362765f4a1d44fb31fe0c8754cb11d73f27ff7d6527b"]}}}},"eslint.config.js":{"size":135,"offset":"454862","integrity":{"algorithm":"SHA256","hash":"52e3a2601a98f23c954d664ab8de95fddb390789f8b067815e484b010d3da2d0","blockSize":4194304,"blocks":["52e3a2601a98f23c954d664ab8de95fddb390789f8b067815e484b010d3da2d0"]}},"index.js":{"size":10385,"offset":"454997","integrity":{"algorithm":"SHA256","hash":"850f0a19f62f5d29a150b1513f9d263c9b346ea8a114b1ee2727e68b7ffb86e9","blockSize":4194304,"blocks":["850f0a19f62f5d29a150b1513f9d263c9b346ea8a114b1ee2727e68b7ffb86e9"]}},"lib":{"files":{"schemes.js":{"size":7122,"offset":"465382","integrity":{"algorithm":"SHA256","hash":"0f9497f8e43c9b002d79c8a916709daa4ae8a6462735b1b5dc6ad587a28a5064","blockSize":4194304,"blocks":["0f9497f8e43c9b002d79c8a916709daa4ae8a6462735b1b5dc6ad587a28a5064"]}},"utils.js":{"size":7987,"offset":"472504","integrity":{"algorithm":"SHA256","hash":"d8b9221420ea43f2f0ffac4a0eb050a386f070cf62742631337702dbb255ff4e","blockSize":4194304,"blocks":["d8b9221420ea43f2f0ffac4a0eb050a386f070cf62742631337702dbb255ff4e"]}}}},"package.json":{"size":864,"offset":"480491","integrity":{"algorithm":"SHA256","hash":"20bb8b82f7b3d178f0ac67499407ab66ba0b0e7b9df58c0b3024851161253d0b","blockSize":4194304,"blocks":["20bb8b82f7b3d178f0ac67499407ab66ba0b0e7b9df58c0b3024851161253d0b"]}},"tsconfig.json":{"size":166,"offset":"481355","integrity":{"algorithm":"SHA256","hash":"6bbba68684f6d6f1613d9ae79de617c25d8d749f30942307faee46a6d2fd721f","blockSize":4194304,"blocks":["6bbba68684f6d6f1613d9ae79de617c25d8d749f30942307faee46a6d2fd721f"]}}}},"find-up":{"files":{"index.js":{"size":968,"offset":"481521","integrity":{"algorithm":"SHA256","hash":"b2b7a4a3a202785dfc044bc9d3798df684c9983008254e44e23258f80c7aba54","blockSize":4194304,"blocks":["b2b7a4a3a202785dfc044bc9d3798df684c9983008254e44e23258f80c7aba54"]}},"license":{"size":1109,"offset":"482489","integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]}},"package.json":{"size":505,"offset":"483598","integrity":{"algorithm":"SHA256","hash":"47ba84a162be94305384419b4ea862550509f0bcaf675e548c5d147303c8ed1e","blockSize":4194304,"blocks":["47ba84a162be94305384419b4ea862550509f0bcaf675e548c5d147303c8ed1e"]}}}},"is-obj":{"files":{"index.js":{"size":144,"offset":"484103","integrity":{"algorithm":"SHA256","hash":"0833a3eed3b0075f23e58f0107bebdedec6db53b4e7b1034d7ea7c9cfb932b0b","blockSize":4194304,"blocks":["0833a3eed3b0075f23e58f0107bebdedec6db53b4e7b1034d7ea7c9cfb932b0b"]}},"license":{"size":1109,"offset":"484247","integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]}},"package.json":{"size":449,"offset":"485356","integrity":{"algorithm":"SHA256","hash":"d86f9e3ed1d4a30339fe5cf042cab7a2415369922aee3a6b13bc7df40814c8c9","blockSize":4194304,"blocks":["d86f9e3ed1d4a30339fe5cf042cab7a2415369922aee3a6b13bc7df40814c8c9"]}}}},"json-schema-traverse":{"files":{".eslintrc.yml":{"size":630,"offset":"485805","integrity":{"algorithm":"SHA256","hash":"b1ea981e2461f053646b08a616efcaba0d3b278b223957e9eb931bcbc3971ccc","blockSize":4194304,"blocks":["b1ea981e2461f053646b08a616efcaba0d3b278b223957e9eb931bcbc3971ccc"]}},"LICENSE":{"size":1074,"offset":"486435","integrity":{"algorithm":"SHA256","hash":"7bf9b2de73a6b356761c948d0e9eeb4be6c1270bd04c79cd489c1e400ffdfc1a","blockSize":4194304,"blocks":["7bf9b2de73a6b356761c948d0e9eeb4be6c1270bd04c79cd489c1e400ffdfc1a"]}},"index.js":{"size":2428,"offset":"487509","integrity":{"algorithm":"SHA256","hash":"024191b747afac01b28ff11d744e9f82720bbad5f716163ba5c962eb62aa2350","blockSize":4194304,"blocks":["024191b747afac01b28ff11d744e9f82720bbad5f716163ba5c962eb62aa2350"]}},"package.json":{"size":553,"offset":"489937","integrity":{"algorithm":"SHA256","hash":"c15049794f847b95bd0a31cea8f8e5fc4d760cab482b3aaa91597e44091ab262","blockSize":4194304,"blocks":["c15049794f847b95bd0a31cea8f8e5fc4d760cab482b3aaa91597e44091ab262"]}},"spec":{"files":{".eslintrc.yml":{"size":91,"offset":"490490","integrity":{"algorithm":"SHA256","hash":"8df0cb64273b71c11db4f99be49c92e6f80f10a13de4599743e4372c8a0be82c","blockSize":4194304,"blocks":["8df0cb64273b71c11db4f99be49c92e6f80f10a13de4599743e4372c8a0be82c"]}},"fixtures":{"files":{"schema.js":{"size":5544,"offset":"490581","integrity":{"algorithm":"SHA256","hash":"0262591e321bc88b22dc33ec78bcded5ab664e2fce2c10b9e0c35d3eb6030d27","blockSize":4194304,"blocks":["0262591e321bc88b22dc33ec78bcded5ab664e2fce2c10b9e0c35d3eb6030d27"]}}}},"index.spec.js":{"size":6042,"offset":"496125","integrity":{"algorithm":"SHA256","hash":"40e6986bda700387e2d397971087a3977d6801bf954591505229691a267c5f69","blockSize":4194304,"blocks":["40e6986bda700387e2d397971087a3977d6801bf954591505229691a267c5f69"]}}}}}},"json-schema-typed":{"files":{"LICENSE":{"size":1386,"offset":"502167","integrity":{"algorithm":"SHA256","hash":"59992f12a42bfad11b6586e1bffda51749bb468847ca27c7070647462a66ed7b","blockSize":4194304,"blocks":["59992f12a42bfad11b6586e1bffda51749bb468847ca27c7070647462a66ed7b"]}},"dist-node":{"files":{"index.js":{"size":2596,"offset":"503553","integrity":{"algorithm":"SHA256","hash":"9fbf92ce11a8e03f63fca828fb7aa814b8f35f0e9d78ed95242988c71a82a3e2","blockSize":4194304,"blocks":["9fbf92ce11a8e03f63fca828fb7aa814b8f35f0e9d78ed95242988c71a82a3e2"]}}}},"dist-src":{"files":{"index.js":{"size":2511,"offset":"506149","integrity":{"algorithm":"SHA256","hash":"d7019674db69d5a5b7443d643a5c909b7b0a320183cb9a149603fb35fa16bf06","blockSize":4194304,"blocks":["d7019674db69d5a5b7443d643a5c909b7b0a320183cb9a149603fb35fa16bf06"]}}}},"dist-web":{"files":{"index.js":{"size":2592,"offset":"508660","integrity":{"algorithm":"SHA256","hash":"2720267bff58c5728dd9ea8cfb1de124ce525003ea58a692c0bdb473f2a8d7e0","blockSize":4194304,"blocks":["2720267bff58c5728dd9ea8cfb1de124ce525003ea58a692c0bdb473f2a8d7e0"]}}}},"package.json":{"size":1548,"offset":"511252","integrity":{"algorithm":"SHA256","hash":"7e19955319863014a6161f4ad8655d7ed60ff94523e65a619c0eb498d96bd7ed","blockSize":4194304,"blocks":["7e19955319863014a6161f4ad8655d7ed60ff94523e65a619c0eb498d96bd7ed"]}}}},"locate-path":{"files":{"index.js":{"size":539,"offset":"512800","integrity":{"algorithm":"SHA256","hash":"0d01be23e2a31212f61ae8856bd916709156f2c56c7434dbe97ea29624b77fd7","blockSize":4194304,"blocks":["0d01be23e2a31212f61ae8856bd916709156f2c56c7434dbe97ea29624b77fd7"]}},"license":{"size":1109,"offset":"513339","integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]}},"package.json":{"size":515,"offset":"514448","integrity":{"algorithm":"SHA256","hash":"ce0e3f841bdf450a3c54421abf5b930daabe079e60c8f6ce2ba9252a017801f2","blockSize":4194304,"blocks":["ce0e3f841bdf450a3c54421abf5b930daabe079e60c8f6ce2ba9252a017801f2"]}}}},"mimic-fn":{"files":{"index.js":{"size":2930,"offset":"514963","integrity":{"algorithm":"SHA256","hash":"d4a832347a07a4df9b32a010fc5ffb1c4447c51769423cd5a3a47da0213fe5c0","blockSize":4194304,"blocks":["d4a832347a07a4df9b32a010fc5ffb1c4447c51769423cd5a3a47da0213fe5c0"]}},"license":{"size":1109,"offset":"517893","integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]}},"package.json":{"size":457,"offset":"519002","integrity":{"algorithm":"SHA256","hash":"08497273cf6cf95285aa094c0be5aedd1b1101f5d1e8858f0c09510ce350cdbe","blockSize":4194304,"blocks":["08497273cf6cf95285aa094c0be5aedd1b1101f5d1e8858f0c09510ce350cdbe"]}}}},"onetime":{"files":{"index.js":{"size":1120,"offset":"519459","integrity":{"algorithm":"SHA256","hash":"59a0b25379fff19195343d47759339397c689e8ab93270adcab2d106a80e1625","blockSize":4194304,"blocks":["59a0b25379fff19195343d47759339397c689e8ab93270adcab2d106a80e1625"]}},"license":{"size":1117,"offset":"520579","integrity":{"algorithm":"SHA256","hash":"5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3","blockSize":4194304,"blocks":["5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3"]}},"package.json":{"size":574,"offset":"521696","integrity":{"algorithm":"SHA256","hash":"b155b599abc77980f0bb4835f6326d419de175e9c085198ed292199844dc1917","blockSize":4194304,"blocks":["b155b599abc77980f0bb4835f6326d419de175e9c085198ed292199844dc1917"]}},"node_modules":{"files":{"mimic-fn":{"files":{"index.js":{"size":300,"offset":"522270","integrity":{"algorithm":"SHA256","hash":"9ca2b409cdf1718ce957292dc479c83516e4ea369f4b2cb3510066d4e50074e2","blockSize":4194304,"blocks":["9ca2b409cdf1718ce957292dc479c83516e4ea369f4b2cb3510066d4e50074e2"]}},"license":{"size":1109,"offset":"522570","integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]}},"package.json":{"size":457,"offset":"523679","integrity":{"algorithm":"SHA256","hash":"98daad7a76353462b42f4d89a340f54caae220bd83d6b46aaf181f77e28cd13f","blockSize":4194304,"blocks":["98daad7a76353462b42f4d89a340f54caae220bd83d6b46aaf181f77e28cd13f"]}}}}}}}},"p-limit":{"files":{"index.js":{"size":1114,"offset":"524136","integrity":{"algorithm":"SHA256","hash":"b005ce7e192e136df67e3b724bfc156c396ac46928c79508d6fd532bef98cbec","blockSize":4194304,"blocks":["b005ce7e192e136df67e3b724bfc156c396ac46928c79508d6fd532bef98cbec"]}},"license":{"size":1109,"offset":"525250","integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]}},"package.json":{"size":709,"offset":"526359","integrity":{"algorithm":"SHA256","hash":"d4c39a75c26a413b0a7b28873811e5cfad2b1d134db1d9c19c7f566f3d25c212","blockSize":4194304,"blocks":["d4c39a75c26a413b0a7b28873811e5cfad2b1d134db1d9c19c7f566f3d25c212"]}}}},"p-locate":{"files":{"index.js":{"size":1042,"offset":"527068","integrity":{"algorithm":"SHA256","hash":"8e5e49ae61d019cf6f74e59e114190fc06bafa85c2084d1731b3ccbeb445e572","blockSize":4194304,"blocks":["8e5e49ae61d019cf6f74e59e114190fc06bafa85c2084d1731b3ccbeb445e572"]}},"license":{"size":1109,"offset":"528110","integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]}},"package.json":{"size":575,"offset":"529219","integrity":{"algorithm":"SHA256","hash":"8c699ec0acfdc16eab80011a4aa974195fb461aeb4d7b577f0af19c8636d32f8","blockSize":4194304,"blocks":["8c699ec0acfdc16eab80011a4aa974195fb461aeb4d7b577f0af19c8636d32f8"]}}}},"p-try":{"files":{"index.js":{"size":211,"offset":"529794","integrity":{"algorithm":"SHA256","hash":"98b069ba5ff64b0f988162a310c47110d5c121d42c33aa7314817393f453c9e3","blockSize":4194304,"blocks":["98b069ba5ff64b0f988162a310c47110d5c121d42c33aa7314817393f453c9e3"]}},"license":{"size":1109,"offset":"530005","integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]}},"package.json":{"size":440,"offset":"531114","integrity":{"algorithm":"SHA256","hash":"af5c7cbf707e18ced31d8a8732df1224b2af6bdc72c5de070fc1b2dea20706e8","blockSize":4194304,"blocks":["af5c7cbf707e18ced31d8a8732df1224b2af6bdc72c5de070fc1b2dea20706e8"]}}}},"path-exists":{"files":{"index.js":{"size":252,"offset":"531554","integrity":{"algorithm":"SHA256","hash":"2557a5378ea2cab729e51b6fce5da24c782940d219a6bd6ade069190e919894f","blockSize":4194304,"blocks":["2557a5378ea2cab729e51b6fce5da24c782940d219a6bd6ade069190e919894f"]}},"license":{"size":1119,"offset":"531806","integrity":{"algorithm":"SHA256","hash":"6fb9754611c20f6649f68805e8c990e83261f29316e29de9e6cedae607b8634c","blockSize":4194304,"blocks":["6fb9754611c20f6649f68805e8c990e83261f29316e29de9e6cedae607b8634c"]}},"package.json":{"size":402,"offset":"532925","integrity":{"algorithm":"SHA256","hash":"30b5457bd77ccd35aa32ba51fa8296b0a3b682f6444f8dba1500559a645f6e95","blockSize":4194304,"blocks":["30b5457bd77ccd35aa32ba51fa8296b0a3b682f6444f8dba1500559a645f6e95"]}}}},"pkg-up":{"files":{"index.js":{"size":194,"offset":"533327","integrity":{"algorithm":"SHA256","hash":"424a480322b22b7315bddab07ef565f450f6f63b5ab920d853237b986d419df2","blockSize":4194304,"blocks":["424a480322b22b7315bddab07ef565f450f6f63b5ab920d853237b986d419df2"]}},"license":{"size":1109,"offset":"533521","integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]}},"package.json":{"size":503,"offset":"534630","integrity":{"algorithm":"SHA256","hash":"7b5ee94b454a2af0d92ee42654e876cb497d810c31a598aecb2212147980e694","blockSize":4194304,"blocks":["7b5ee94b454a2af0d92ee42654e876cb497d810c31a598aecb2212147980e694"]}}}},"require-from-string":{"files":{"index.js":{"size":866,"offset":"535133","integrity":{"algorithm":"SHA256","hash":"cb059342a762b955997bf780f3693add176922727f2fa9f11fcaf1b3fc323239","blockSize":4194304,"blocks":["cb059342a762b955997bf780f3693add176922727f2fa9f11fcaf1b3fc323239"]}},"license":{"size":1128,"offset":"535999","integrity":{"algorithm":"SHA256","hash":"6ee0feb1f6ef996ff5a68600f8cf98909cf412d39ef3cdceaefd87d636fa1b7f","blockSize":4194304,"blocks":["6ee0feb1f6ef996ff5a68600f8cf98909cf412d39ef3cdceaefd87d636fa1b7f"]}},"package.json":{"size":442,"offset":"537127","integrity":{"algorithm":"SHA256","hash":"bbd907e5490c34cc6b814f56cd2180edb03bc594b88cdf1e112ed94d0d6218a3","blockSize":4194304,"blocks":["bbd907e5490c34cc6b814f56cd2180edb03bc594b88cdf1e112ed94d0d6218a3"]}}}},"semver":{"files":{"LICENSE":{"size":765,"offset":"537569","integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]}},"bin":{"files":{"semver.js":{"size":4748,"offset":"538334","integrity":{"algorithm":"SHA256","hash":"82c28f9bc9e598d255edd507d1e9b157f37b8dac0f2da25a813b5e7121600be8","blockSize":4194304,"blocks":["82c28f9bc9e598d255edd507d1e9b157f37b8dac0f2da25a813b5e7121600be8"]},"executable":true}}},"classes":{"files":{"comparator.js":{"size":3631,"offset":"543082","integrity":{"algorithm":"SHA256","hash":"054202956430d63d5ff4599fae09760ce465b489e4f0b5ef5ce7cc7ac21157ac","blockSize":4194304,"blocks":["054202956430d63d5ff4599fae09760ce465b489e4f0b5ef5ce7cc7ac21157ac"]}},"index.js":{"size":143,"offset":"546713","integrity":{"algorithm":"SHA256","hash":"3bb69280c2a788d0eb16f915bb9df4dbe812075182024c753dca2283bcea1b17","blockSize":4194304,"blocks":["3bb69280c2a788d0eb16f915bb9df4dbe812075182024c753dca2283bcea1b17"]}},"range.js":{"size":14977,"offset":"546856","integrity":{"algorithm":"SHA256","hash":"cf8f8eb6934663ae2a9d04838d4d71555427a2abd3c8748ee5219507969a6b46","blockSize":4194304,"blocks":["cf8f8eb6934663ae2a9d04838d4d71555427a2abd3c8748ee5219507969a6b46"]}},"semver.js":{"size":9480,"offset":"561833","integrity":{"algorithm":"SHA256","hash":"d5ba57e5c93f031b1d234fca4bb746746fcd1fe51be7e5ee895601e2c12e2083","blockSize":4194304,"blocks":["d5ba57e5c93f031b1d234fca4bb746746fcd1fe51be7e5ee895601e2c12e2083"]}}}},"functions":{"files":{"clean.js":{"size":205,"offset":"571313","integrity":{"algorithm":"SHA256","hash":"4eadb0892844cf3ae295121a86163a66c73f89acd1b7f0b114ec115b4539512f","blockSize":4194304,"blocks":["4eadb0892844cf3ae295121a86163a66c73f89acd1b7f0b114ec115b4539512f"]}},"cmp.js":{"size":961,"offset":"571518","integrity":{"algorithm":"SHA256","hash":"a63d74e87b73788e78e9ce0a4892b5333d6b809c0de88b31e4ed76cbf17f94b3","blockSize":4194304,"blocks":["a63d74e87b73788e78e9ce0a4892b5333d6b809c0de88b31e4ed76cbf17f94b3"]}},"coerce.js":{"size":2004,"offset":"572479","integrity":{"algorithm":"SHA256","hash":"28a251c5ab210ddf9e97551b9f37a53329fcce91f0c3943dcbc02de1a1de915a","blockSize":4194304,"blocks":["28a251c5ab210ddf9e97551b9f37a53329fcce91f0c3943dcbc02de1a1de915a"]}},"compare-build.js":{"size":281,"offset":"574483","integrity":{"algorithm":"SHA256","hash":"5ab651d5b40af289bd85c645a92b6d8cfe1a986dc413c797cfcc8d623d7c844c","blockSize":4194304,"blocks":["5ab651d5b40af289bd85c645a92b6d8cfe1a986dc413c797cfcc8d623d7c844c"]}},"compare-loose.js":{"size":132,"offset":"574764","integrity":{"algorithm":"SHA256","hash":"07b6a3a1db0a5210ceb784c1708bd4679f3a94fc73a9c9eb349349e7070a6f78","blockSize":4194304,"blocks":["07b6a3a1db0a5210ceb784c1708bd4679f3a94fc73a9c9eb349349e7070a6f78"]}},"compare.js":{"size":170,"offset":"574896","integrity":{"algorithm":"SHA256","hash":"d404b5aa48aaddc8a654c5da8fb7d4443404b7948589b21ac4b045d1cee4e34c","blockSize":4194304,"blocks":["d404b5aa48aaddc8a654c5da8fb7d4443404b7948589b21ac4b045d1cee4e34c"]}},"diff.js":{"size":1423,"offset":"575066","integrity":{"algorithm":"SHA256","hash":"7a11fd39b987cdf06c65e928cb1aca49bec583feb86fb5c8fe47a6fd61d7de31","blockSize":4194304,"blocks":["7a11fd39b987cdf06c65e928cb1aca49bec583feb86fb5c8fe47a6fd61d7de31"]}},"eq.js":{"size":126,"offset":"576489","integrity":{"algorithm":"SHA256","hash":"b6e30a7168e52723216fc163d300e2bbabf92ec0251f9ac5438bb6ccf57c8936","blockSize":4194304,"blocks":["b6e30a7168e52723216fc163d300e2bbabf92ec0251f9ac5438bb6ccf57c8936"]}},"gt.js":{"size":124,"offset":"576615","integrity":{"algorithm":"SHA256","hash":"135523704aa48cd98834dd170ee9f74f0e68043b379f32d021db11e6304c5c93","blockSize":4194304,"blocks":["135523704aa48cd98834dd170ee9f74f0e68043b379f32d021db11e6304c5c93"]}},"gte.js":{"size":127,"offset":"576739","integrity":{"algorithm":"SHA256","hash":"991c5bbe48ecb210a562646872f05862ad9fc0d42186d85aa60bdc6fa323eb9d","blockSize":4194304,"blocks":["991c5bbe48ecb210a562646872f05862ad9fc0d42186d85aa60bdc6fa323eb9d"]}},"inc.js":{"size":478,"offset":"576866","integrity":{"algorithm":"SHA256","hash":"952069fc8690b7d3af0fe9d55f7c54fe2ac067b48c5e74f6a54f9ce19a334493","blockSize":4194304,"blocks":["952069fc8690b7d3af0fe9d55f7c54fe2ac067b48c5e74f6a54f9ce19a334493"]}},"lt.js":{"size":124,"offset":"577344","integrity":{"algorithm":"SHA256","hash":"1c897a9bc849320e2e9dc0f6c09555c01ee3ddf30734515d717b88ad7740ea25","blockSize":4194304,"blocks":["1c897a9bc849320e2e9dc0f6c09555c01ee3ddf30734515d717b88ad7740ea25"]}},"lte.js":{"size":127,"offset":"577468","integrity":{"algorithm":"SHA256","hash":"3a8d0b1d00423f60cc7cb810b36ab77b61330831ad237dbe73eb5cecfa412800","blockSize":4194304,"blocks":["3a8d0b1d00423f60cc7cb810b36ab77b61330831ad237dbe73eb5cecfa412800"]}},"major.js":{"size":136,"offset":"577595","integrity":{"algorithm":"SHA256","hash":"5c678480d882f511200fed2c16ec3847dfedb08a1d70328dc2f031d35d825276","blockSize":4194304,"blocks":["5c678480d882f511200fed2c16ec3847dfedb08a1d70328dc2f031d35d825276"]}},"minor.js":{"size":136,"offset":"577731","integrity":{"algorithm":"SHA256","hash":"1b051794f1713adec2a236517196691687c35f82e0b596ff3316a78b3cc10ae6","blockSize":4194304,"blocks":["1b051794f1713adec2a236517196691687c35f82e0b596ff3316a78b3cc10ae6"]}},"neq.js":{"size":128,"offset":"577867","integrity":{"algorithm":"SHA256","hash":"a662883751918822c162183b46b9e20d09489132f82686c92ab78bee67f3a127","blockSize":4194304,"blocks":["a662883751918822c162183b46b9e20d09489132f82686c92ab78bee67f3a127"]}},"parse.js":{"size":331,"offset":"577995","integrity":{"algorithm":"SHA256","hash":"29a69e15b6d02fe381d573f861881a89590e9d0f0f0ca740c5f85eaf0234c4ad","blockSize":4194304,"blocks":["29a69e15b6d02fe381d573f861881a89590e9d0f0f0ca740c5f85eaf0234c4ad"]}},"patch.js":{"size":136,"offset":"578326","integrity":{"algorithm":"SHA256","hash":"f02d3c1b059fe3d96ce124886f7eef321d381a95638fd3c4a8d5ccd8e76ffadd","blockSize":4194304,"blocks":["f02d3c1b059fe3d96ce124886f7eef321d381a95638fd3c4a8d5ccd8e76ffadd"]}},"prerelease.js":{"size":234,"offset":"578462","integrity":{"algorithm":"SHA256","hash":"baedbf503d5610ad041bfb56071efa48feb331ca278295c399537d35d3ffb593","blockSize":4194304,"blocks":["baedbf503d5610ad041bfb56071efa48feb331ca278295c399537d35d3ffb593"]}},"rcompare.js":{"size":132,"offset":"578696","integrity":{"algorithm":"SHA256","hash":"84fa5e88adf08d15c993cac8cdec6d1a65045b7e95a9c55184230a7f807f4dc0","blockSize":4194304,"blocks":["84fa5e88adf08d15c993cac8cdec6d1a65045b7e95a9c55184230a7f807f4dc0"]}},"rsort.js":{"size":163,"offset":"578828","integrity":{"algorithm":"SHA256","hash":"6ec659ce3b6c2b173c719286caab04409adba046c0917874ec3b5e36ddfbc7e3","blockSize":4194304,"blocks":["6ec659ce3b6c2b173c719286caab04409adba046c0917874ec3b5e36ddfbc7e3"]}},"satisfies.js":{"size":247,"offset":"578991","integrity":{"algorithm":"SHA256","hash":"8cf5e122b757251671ed6c9d9680904b71cd375845853f05312e608cf2cc2946","blockSize":4194304,"blocks":["8cf5e122b757251671ed6c9d9680904b71cd375845853f05312e608cf2cc2946"]}},"sort.js":{"size":161,"offset":"579238","integrity":{"algorithm":"SHA256","hash":"c2fe2d3ed0be8a4e9de8f02abdfd5d9c0d3bcc510d88e87af84185592882c4b8","blockSize":4194304,"blocks":["c2fe2d3ed0be8a4e9de8f02abdfd5d9c0d3bcc510d88e87af84185592882c4b8"]}},"valid.js":{"size":176,"offset":"579399","integrity":{"algorithm":"SHA256","hash":"0de7ea736cb7807179d46dfac09c830a9338e02b6a07db12d7040cde2def6025","blockSize":4194304,"blocks":["0de7ea736cb7807179d46dfac09c830a9338e02b6a07db12d7040cde2def6025"]}}}},"index.js":{"size":2630,"offset":"579575","integrity":{"algorithm":"SHA256","hash":"646e0b707f56dca7cb90cebc6fe687278bcc1a16fdcc83756dbe23083ff15e06","blockSize":4194304,"blocks":["646e0b707f56dca7cb90cebc6fe687278bcc1a16fdcc83756dbe23083ff15e06"]}},"internal":{"files":{"constants.js":{"size":873,"offset":"582205","integrity":{"algorithm":"SHA256","hash":"38a112baf27ceca0260082ff26ac2fd7a9861cab1af12dd65e720277f68e6ce9","blockSize":4194304,"blocks":["38a112baf27ceca0260082ff26ac2fd7a9861cab1af12dd65e720277f68e6ce9"]}},"debug.js":{"size":240,"offset":"583078","integrity":{"algorithm":"SHA256","hash":"8a9f420572260f3cf944463b5090d62a60f0730589dc23a7ec4ca25e2ee41bb3","blockSize":4194304,"blocks":["8a9f420572260f3cf944463b5090d62a60f0730589dc23a7ec4ca25e2ee41bb3"]}},"identifiers.js":{"size":525,"offset":"583318","integrity":{"algorithm":"SHA256","hash":"b4916b09dc7869ae0eb05e71c855c942a3a7365f7e6e89185d59a9e45a2451d7","blockSize":4194304,"blocks":["b4916b09dc7869ae0eb05e71c855c942a3a7365f7e6e89185d59a9e45a2451d7"]}},"lrucache.js":{"size":802,"offset":"583843","integrity":{"algorithm":"SHA256","hash":"14d087c87da87b6f5c36fc4cdd7d2d14077874b14a68e20fce5b6138fa2ca34f","blockSize":4194304,"blocks":["14d087c87da87b6f5c36fc4cdd7d2d14077874b14a68e20fce5b6138fa2ca34f"]}},"parse-options.js":{"size":338,"offset":"584645","integrity":{"algorithm":"SHA256","hash":"fdf51d0de8d5442c35a997ef58cd530d239ce206f961d14c5121354451b01d01","blockSize":4194304,"blocks":["fdf51d0de8d5442c35a997ef58cd530d239ce206f961d14c5121354451b01d01"]}},"re.js":{"size":8138,"offset":"584983","integrity":{"algorithm":"SHA256","hash":"6a47e73c279fa8c4011f670471f50830a39922b43797b2884e6cc03f65b64d6c","blockSize":4194304,"blocks":["6a47e73c279fa8c4011f670471f50830a39922b43797b2884e6cc03f65b64d6c"]}}}},"package.json":{"size":1350,"offset":"593121","integrity":{"algorithm":"SHA256","hash":"783e44dd42d6021177385b15de76f71d49d472f79b60ab22ed69f336d5e0f9d9","blockSize":4194304,"blocks":["783e44dd42d6021177385b15de76f71d49d472f79b60ab22ed69f336d5e0f9d9"]}},"preload.js":{"size":83,"offset":"594471","integrity":{"algorithm":"SHA256","hash":"edb6808911bebcb324b2df57e5c9935149e56984ff083b74c6cfe215f5b710ba","blockSize":4194304,"blocks":["edb6808911bebcb324b2df57e5c9935149e56984ff083b74c6cfe215f5b710ba"]}},"range.bnf":{"size":619,"offset":"594554","integrity":{"algorithm":"SHA256","hash":"ed628fdaff64be366d07f6cc4559eae4de109826f743ea7f5e1588c370bca49a","blockSize":4194304,"blocks":["ed628fdaff64be366d07f6cc4559eae4de109826f743ea7f5e1588c370bca49a"]}},"ranges":{"files":{"gtr.js":{"size":231,"offset":"595173","integrity":{"algorithm":"SHA256","hash":"8fadad28e36d28e93d498ac7ac20badba2a407312845eabc18e82e90a0732b19","blockSize":4194304,"blocks":["8fadad28e36d28e93d498ac7ac20badba2a407312845eabc18e82e90a0732b19"]}},"intersects.js":{"size":224,"offset":"595404","integrity":{"algorithm":"SHA256","hash":"fe87ac5d3020010ad3ec00636dadbf0c669ff07d0f57e0a8165a8264f79a676f","blockSize":4194304,"blocks":["fe87ac5d3020010ad3ec00636dadbf0c669ff07d0f57e0a8165a8264f79a676f"]}},"ltr.js":{"size":227,"offset":"595628","integrity":{"algorithm":"SHA256","hash":"e5186fcc03018acf9be6d968755d4c49727aeb0d981d179eb568ae5fbe983038","blockSize":4194304,"blocks":["e5186fcc03018acf9be6d968755d4c49727aeb0d981d179eb568ae5fbe983038"]}},"max-satisfying.js":{"size":593,"offset":"595855","integrity":{"algorithm":"SHA256","hash":"e1a2c0d6144cc772cd20bbc8ecb9e8a3a4074e9172a3d8e794838b591cdeb416","blockSize":4194304,"blocks":["e1a2c0d6144cc772cd20bbc8ecb9e8a3a4074e9172a3d8e794838b591cdeb416"]}},"min-satisfying.js":{"size":591,"offset":"596448","integrity":{"algorithm":"SHA256","hash":"2681abf54098aa670f12826b76a6ec77a2441186ae4243afde3be8ae4908f7ca","blockSize":4194304,"blocks":["2681abf54098aa670f12826b76a6ec77a2441186ae4243afde3be8ae4908f7ca"]}},"min-version.js":{"size":1514,"offset":"597039","integrity":{"algorithm":"SHA256","hash":"fefba0a88c2bf74d5cede504b5ae50a8dc3edfd69cf0174a491e2cf3e442614b","blockSize":4194304,"blocks":["fefba0a88c2bf74d5cede504b5ae50a8dc3edfd69cf0174a491e2cf3e442614b"]}},"outside.js":{"size":2204,"offset":"598553","integrity":{"algorithm":"SHA256","hash":"3a2b0b23593d2f49419c06af2af75450cab103b0c25d665d48fe5bca495a21ca","blockSize":4194304,"blocks":["3a2b0b23593d2f49419c06af2af75450cab103b0c25d665d48fe5bca495a21ca"]}},"simplify.js":{"size":1355,"offset":"600757","integrity":{"algorithm":"SHA256","hash":"7b78581c13322bc68ece2088685386b2a9b51c15b94d0a2063bdf2546bd41934","blockSize":4194304,"blocks":["7b78581c13322bc68ece2088685386b2a9b51c15b94d0a2063bdf2546bd41934"]}},"subset.js":{"size":7524,"offset":"602112","integrity":{"algorithm":"SHA256","hash":"87387952fbe154f5874d5f09dd2173e782e894a76fa8370ce23f4120e2ae7eae","blockSize":4194304,"blocks":["87387952fbe154f5874d5f09dd2173e782e894a76fa8370ce23f4120e2ae7eae"]}},"to-comparators.js":{"size":282,"offset":"609636","integrity":{"algorithm":"SHA256","hash":"6c5e966210cff270fa2850668aaf8460fac7759f8d99f282521ef7a78f4564e9","blockSize":4194304,"blocks":["6c5e966210cff270fa2850668aaf8460fac7759f8d99f282521ef7a78f4564e9"]}},"valid.js":{"size":326,"offset":"609918","integrity":{"algorithm":"SHA256","hash":"5ef6f995af801868925940cf8df5735d565ebabb090b068695cae65218bcd3ac","blockSize":4194304,"blocks":["5ef6f995af801868925940cf8df5735d565ebabb090b068695cae65218bcd3ac"]}}}}}},"type-fest":{"files":{"package.json":{"size":654,"offset":"610244","integrity":{"algorithm":"SHA256","hash":"60eea41c2a8b76dd846b458bd18a4ea0b09b138a3bc244c079fc48dec3f746ad","blockSize":4194304,"blocks":["60eea41c2a8b76dd846b458bd18a4ea0b09b138a3bc244c079fc48dec3f746ad"]}}}}}},"dist":{"files":{"main":{"files":{"index.js":{"size":266071,"offset":"610898","integrity":{"algorithm":"SHA256","hash":"c0085ab8c600e2f05aa211dfffac1d711952a3cc18e40515faa1a85a1be36499","blockSize":4194304,"blocks":["c0085ab8c600e2f05aa211dfffac1d711952a3cc18e40515faa1a85a1be36499"]}}}},"preload":{"files":{"index.js":{"size":76679,"offset":"876969","integrity":{"algorithm":"SHA256","hash":"a1b39d22ba2381f581e92e4483bea1a51cba4d464b64d8a3fb854ee458cc71e8","blockSize":4194304,"blocks":["a1b39d22ba2381f581e92e4483bea1a51cba4d464b64d8a3fb854ee458cc71e8"]}}}}}},"package.json":{"size":414,"offset":"953648","integrity":{"algorithm":"SHA256","hash":"8635ece536b8e4cf10355dad240ec4810521a034aad20781ed42cd6b7fad1da6","blockSize":4194304,"blocks":["8635ece536b8e4cf10355dad240ec4810521a034aad20781ed42cd6b7fad1da6"]}}}}   const Ajv = require("ajv")
const ajv = new Ajv({allErrors: true})

const schema = {
  type: "object",
  properties: {
    foo: {type: "string"},
    bar: {type: "number", maximum: 3},
  },
  required: ["foo", "bar"],
  additionalProperties: false,
}

const validate = ajv.compile(schema)

test({foo: "abc", bar: 2})
test({foo: 2, bar: 4})

function test(data) {
  const valid = validate(data)
  if (valid) console.log("Valid!")
  else console.log("Invalid: " + ajv.errorsText(validate.errors))
}
The MIT License (MIT)

Copyright (c) 2015-2021 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv2019 = void 0;
const core_1 = require("./core");
const draft7_1 = require("./vocabularies/draft7");
const dynamic_1 = require("./vocabularies/dynamic");
const next_1 = require("./vocabularies/next");
const unevaluated_1 = require("./vocabularies/unevaluated");
const discriminator_1 = require("./vocabularies/discriminator");
const json_schema_2019_09_1 = require("./refs/json-schema-2019-09");
const META_SCHEMA_ID = "https://json-schema.org/draft/2019-09/schema";
class Ajv2019 extends core_1.default {
    constructor(opts = {}) {
        super({
            ...opts,
            dynamicRef: true,
            next: true,
            unevaluated: true,
        });
    }
    _addVocabularies() {
        super._addVocabularies();
        this.addVocabulary(dynamic_1.default);
        draft7_1.default.forEach((v) => this.addVocabulary(v));
        this.addVocabulary(next_1.default);
        this.addVocabulary(unevaluated_1.default);
        if (this.opts.discriminator)
            this.addKeyword(discriminator_1.default);
    }
    _addDefaultMetaSchema() {
        super._addDefaultMetaSchema();
        const { $data, meta } = this.opts;
        if (!meta)
            return;
        json_schema_2019_09_1.default.call(this, $data);
        this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID;
    }
    defaultMeta() {
        return (this.opts.defaultMeta =
            super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : undefined));
    }
}
exports.Ajv2019 = Ajv2019;
module.exports = exports = Ajv2019;
module.exports.Ajv2019 = Ajv2019;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = Ajv2019;
var validate_1 = require("./compile/validate");
Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function () { return validate_1.KeywordCxt; } });
var codegen_1 = require("./compile/codegen");
Object.defineProperty(exports, "_", { enumerable: true, get: function () { return codegen_1._; } });
Object.defineProperty(exports, "str", { enumerable: true, get: function () { return codegen_1.str; } });
Object.defineProperty(exports, "stringify", { enumerable: true, get: function () { return codegen_1.stringify; } });
Object.defineProperty(exports, "nil", { enumerable: true, get: function () { return codegen_1.nil; } });
Object.defineProperty(exports, "Name", { enumerable: true, get: function () { return codegen_1.Name; } });
Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function () { return codegen_1.CodeGen; } });
var validation_error_1 = require("./runtime/validation_error");
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return validation_error_1.default; } });
var ref_error_1 = require("./compile/ref_error");
Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function () { return ref_error_1.default; } });
//# sourceMappingURL=2019.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv2020 = void 0;
const core_1 = require("./core");
const draft2020_1 = require("./vocabularies/draft2020");
const discriminator_1 = require("./vocabularies/discriminator");
const json_schema_2020_12_1 = require("./refs/json-schema-2020-12");
const META_SCHEMA_ID = "https://json-schema.org/draft/2020-12/schema";
class Ajv2020 extends core_1.default {
    constructor(opts = {}) {
        super({
            ...opts,
            dynamicRef: true,
            next: true,
            unevaluated: true,
        });
    }
    _addVocabularies() {
        super._addVocabularies();
        draft2020_1.default.forEach((v) => this.addVocabulary(v));
        if (this.opts.discriminator)
            this.addKeyword(discriminator_1.default);
    }
    _addDefaultMetaSchema() {
        super._addDefaultMetaSchema();
        const { $data, meta } = this.opts;
        if (!meta)
            return;
        json_schema_2020_12_1.default.call(this, $data);
        this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID;
    }
    defaultMeta() {
        return (this.opts.defaultMeta =
            super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : undefined));
    }
}
exports.Ajv2020 = Ajv2020;
module.exports = exports = Ajv2020;
module.exports.Ajv2020 = Ajv2020;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = Ajv2020;
var validate_1 = require("./compile/validate");
Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function () { return validate_1.KeywordCxt; } });
var codegen_1 = require("./compile/codegen");
Object.defineProperty(exports, "_", { enumerable: true, get: function () { return codegen_1._; } });
Object.defineProperty(exports, "str", { enumerable: true, get: function () { return codegen_1.str; } });
Object.defineProperty(exports, "stringify", { enumerable: true, get: function () { return codegen_1.stringify; } });
Object.defineProperty(exports, "nil", { enumerable: true, get: function () { return codegen_1.nil; } });
Object.defineProperty(exports, "Name", { enumerable: true, get: function () { return codegen_1.Name; } });
Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function () { return codegen_1.CodeGen; } });
var validation_error_1 = require("./runtime/validation_error");
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return validation_error_1.default; } });
var ref_error_1 = require("./compile/ref_error");
Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function () { return ref_error_1.default; } });
//# sourceMappingURL=2020.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0;
const core_1 = require("./core");
const draft7_1 = require("./vocabularies/draft7");
const discriminator_1 = require("./vocabularies/discriminator");
const draft7MetaSchema = require("./refs/json-schema-draft-07.json");
const META_SUPPORT_DATA = ["/properties"];
const META_SCHEMA_ID = "http://json-schema.org/draft-07/schema";
class Ajv extends core_1.default {
    _addVocabularies() {
        super._addVocabularies();
        draft7_1.default.forEach((v) => this.addVocabulary(v));
        if (this.opts.discriminator)
            this.addKeyword(discriminator_1.default);
    }
    _addDefaultMetaSchema() {
        super._addDefaultMetaSchema();
        if (!this.opts.meta)
            return;
        const metaSchema = this.opts.$data
            ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA)
            : draft7MetaSchema;
        this.addMetaSchema(metaSchema, META_SCHEMA_ID, false);
        this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID;
    }
    defaultMeta() {
        return (this.opts.defaultMeta =
            super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : undefined));
    }
}
exports.Ajv = Ajv;
module.exports = exports = Ajv;
module.exports.Ajv = Ajv;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = Ajv;
var validate_1 = require("./compile/validate");
Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function () { return validate_1.KeywordCxt; } });
var codegen_1 = require("./compile/codegen");
Object.defineProperty(exports, "_", { enumerable: true, get: function () { return codegen_1._; } });
Object.defineProperty(exports, "str", { enumerable: true, get: function () { return codegen_1.str; } });
Object.defineProperty(exports, "stringify", { enumerable: true, get: function () { return codegen_1.stringify; } });
Object.defineProperty(exports, "nil", { enumerable: true, get: function () { return codegen_1.nil; } });
Object.defineProperty(exports, "Name", { enumerable: true, get: function () { return codegen_1.Name; } });
Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function () { return codegen_1.CodeGen; } });
var validation_error_1 = require("./runtime/validation_error");
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return validation_error_1.default; } });
var ref_error_1 = require("./compile/ref_error");
Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function () { return ref_error_1.default; } });
//# sourceMappingURL=ajv.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0;
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
class _CodeOrName {
}
exports._CodeOrName = _CodeOrName;
exports.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;
class Name extends _CodeOrName {
    constructor(s) {
        super();
        if (!exports.IDENTIFIER.test(s))
            throw new Error("CodeGen: name must be a valid identifier");
        this.str = s;
    }
    toString() {
        return this.str;
    }
    emptyStr() {
        return false;
    }
    get names() {
        return { [this.str]: 1 };
    }
}
exports.Name = Name;
class _Code extends _CodeOrName {
    constructor(code) {
        super();
        this._items = typeof code === "string" ? [code] : code;
    }
    toString() {
        return this.str;
    }
    emptyStr() {
        if (this._items.length > 1)
            return false;
        const item = this._items[0];
        return item === "" || item === '""';
    }
    get str() {
        var _a;
        return ((_a = this._str) !== null && _a !== void 0 ? _a : (this._str = this._items.reduce((s, c) => `${s}${c}`, "")));
    }
    get names() {
        var _a;
        return ((_a = this._names) !== null && _a !== void 0 ? _a : (this._names = this._items.reduce((names, c) => {
            if (c instanceof Name)
                names[c.str] = (names[c.str] || 0) + 1;
            return names;
        }, {})));
    }
}
exports._Code = _Code;
exports.nil = new _Code("");
function _(strs, ...args) {
    const code = [strs[0]];
    let i = 0;
    while (i < args.length) {
        addCodeArg(code, args[i]);
        code.push(strs[++i]);
    }
    return new _Code(code);
}
exports._ = _;
const plus = new _Code("+");
function str(strs, ...args) {
    const expr = [safeStringify(strs[0])];
    let i = 0;
    while (i < args.length) {
        expr.push(plus);
        addCodeArg(expr, args[i]);
        expr.push(plus, safeStringify(strs[++i]));
    }
    optimize(expr);
    return new _Code(expr);
}
exports.str = str;
function addCodeArg(code, arg) {
    if (arg instanceof _Code)
        code.push(...arg._items);
    else if (arg instanceof Name)
        code.push(arg);
    else
        code.push(interpolate(arg));
}
exports.addCodeArg = addCodeArg;
function optimize(expr) {
    let i = 1;
    while (i < expr.length - 1) {
        if (expr[i] === plus) {
            const res = mergeExprItems(expr[i - 1], expr[i + 1]);
            if (res !== undefined) {
                expr.splice(i - 1, 3, res);
                continue;
            }
            expr[i++] = "+";
        }
        i++;
    }
}
function mergeExprItems(a, b) {
    if (b === '""')
        return a;
    if (a === '""')
        return b;
    if (typeof a == "string") {
        if (b instanceof Name || a[a.length - 1] !== '"')
            return;
        if (typeof b != "string")
            return `${a.slice(0, -1)}${b}"`;
        if (b[0] === '"')
            return a.slice(0, -1) + b.slice(1);
        return;
    }
    if (typeof b == "string" && b[0] === '"' && !(a instanceof Name))
        return `"${a}${b.slice(1)}`;
    return;
}
function strConcat(c1, c2) {
    return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str `${c1}${c2}`;
}
exports.strConcat = strConcat;
// TODO do not allow arrays here
function interpolate(x) {
    return typeof x == "number" || typeof x == "boolean" || x === null
        ? x
        : safeStringify(Array.isArray(x) ? x.join(",") : x);
}
function stringify(x) {
    return new _Code(safeStringify(x));
}
exports.stringify = stringify;
function safeStringify(x) {
    return JSON.stringify(x)
        .replace(/\u2028/g, "\\u2028")
        .replace(/\u2029/g, "\\u2029");
}
exports.safeStringify = safeStringify;
function getProperty(key) {
    return typeof key == "string" && exports.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _ `[${key}]`;
}
exports.getProperty = getProperty;
//Does best effort to format the name properly
function getEsmExportName(key) {
    if (typeof key == "string" && exports.IDENTIFIER.test(key)) {
        return new _Code(`${key}`);
    }
    throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`);
}
exports.getEsmExportName = getEsmExportName;
function regexpCode(rx) {
    return new _Code(rx.toString());
}
exports.regexpCode = regexpCode;
//# sourceMappingURL=code.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0;
const code_1 = require("./code");
const scope_1 = require("./scope");
var code_2 = require("./code");
Object.defineProperty(exports, "_", { enumerable: true, get: function () { return code_2._; } });
Object.defineProperty(exports, "str", { enumerable: true, get: function () { return code_2.str; } });
Object.defineProperty(exports, "strConcat", { enumerable: true, get: function () { return code_2.strConcat; } });
Object.defineProperty(exports, "nil", { enumerable: true, get: function () { return code_2.nil; } });
Object.defineProperty(exports, "getProperty", { enumerable: true, get: function () { return code_2.getProperty; } });
Object.defineProperty(exports, "stringify", { enumerable: true, get: function () { return code_2.stringify; } });
Object.defineProperty(exports, "regexpCode", { enumerable: true, get: function () { return code_2.regexpCode; } });
Object.defineProperty(exports, "Name", { enumerable: true, get: function () { return code_2.Name; } });
var scope_2 = require("./scope");
Object.defineProperty(exports, "Scope", { enumerable: true, get: function () { return scope_2.Scope; } });
Object.defineProperty(exports, "ValueScope", { enumerable: true, get: function () { return scope_2.ValueScope; } });
Object.defineProperty(exports, "ValueScopeName", { enumerable: true, get: function () { return scope_2.ValueScopeName; } });
Object.defineProperty(exports, "varKinds", { enumerable: true, get: function () { return scope_2.varKinds; } });
exports.operators = {
    GT: new code_1._Code(">"),
    GTE: new code_1._Code(">="),
    LT: new code_1._Code("<"),
    LTE: new code_1._Code("<="),
    EQ: new code_1._Code("==="),
    NEQ: new code_1._Code("!=="),
    NOT: new code_1._Code("!"),
    OR: new code_1._Code("||"),
    AND: new code_1._Code("&&"),
    ADD: new code_1._Code("+"),
};
class Node {
    optimizeNodes() {
        return this;
    }
    optimizeNames(_names, _constants) {
        return this;
    }
}
class Def extends Node {
    constructor(varKind, name, rhs) {
        super();
        this.varKind = varKind;
        this.name = name;
        this.rhs = rhs;
    }
    render({ es5, _n }) {
        const varKind = es5 ? scope_1.varKinds.var : this.varKind;
        const rhs = this.rhs === undefined ? "" : ` = ${this.rhs}`;
        return `${varKind} ${this.name}${rhs};` + _n;
    }
    optimizeNames(names, constants) {
        if (!names[this.name.str])
            return;
        if (this.rhs)
            this.rhs = optimizeExpr(this.rhs, names, constants);
        return this;
    }
    get names() {
        return this.rhs instanceof code_1._CodeOrName ? this.rhs.names : {};
    }
}
class Assign extends Node {
    constructor(lhs, rhs, sideEffects) {
        super();
        this.lhs = lhs;
        this.rhs = rhs;
        this.sideEffects = sideEffects;
    }
    render({ _n }) {
        return `${this.lhs} = ${this.rhs};` + _n;
    }
    optimizeNames(names, constants) {
        if (this.lhs instanceof code_1.Name && !names[this.lhs.str] && !this.sideEffects)
            return;
        this.rhs = optimizeExpr(this.rhs, names, constants);
        return this;
    }
    get names() {
        const names = this.lhs instanceof code_1.Name ? {} : { ...this.lhs.names };
        return addExprNames(names, this.rhs);
    }
}
class AssignOp extends Assign {
    constructor(lhs, op, rhs, sideEffects) {
        super(lhs, rhs, sideEffects);
        this.op = op;
    }
    render({ _n }) {
        return `${this.lhs} ${this.op}= ${this.rhs};` + _n;
    }
}
class Label extends Node {
    constructor(label) {
        super();
        this.label = label;
        this.names = {};
    }
    render({ _n }) {
        return `${this.label}:` + _n;
    }
}
class Break extends Node {
    constructor(label) {
        super();
        this.label = label;
        this.names = {};
    }
    render({ _n }) {
        const label = this.label ? ` ${this.label}` : "";
        return `break${label};` + _n;
    }
}
class Throw extends Node {
    constructor(error) {
        super();
        this.error = error;
    }
    render({ _n }) {
        return `throw ${this.error};` + _n;
    }
    get names() {
        return this.error.names;
    }
}
class AnyCode extends Node {
    constructor(code) {
        super();
        this.code = code;
    }
    render({ _n }) {
        return `${this.code};` + _n;
    }
    optimizeNodes() {
        return `${this.code}` ? this : undefined;
    }
    optimizeNames(names, constants) {
        this.code = optimizeExpr(this.code, names, constants);
        return this;
    }
    get names() {
        return this.code instanceof code_1._CodeOrName ? this.code.names : {};
    }
}
class ParentNode extends Node {
    constructor(nodes = []) {
        super();
        this.nodes = nodes;
    }
    render(opts) {
        return this.nodes.reduce((code, n) => code + n.render(opts), "");
    }
    optimizeNodes() {
        const { nodes } = this;
        let i = nodes.length;
        while (i--) {
            const n = nodes[i].optimizeNodes();
            if (Array.isArray(n))
                nodes.splice(i, 1, ...n);
            else if (n)
                nodes[i] = n;
            else
                nodes.splice(i, 1);
        }
        return nodes.length > 0 ? this : undefined;
    }
    optimizeNames(names, constants) {
        const { nodes } = this;
        let i = nodes.length;
        while (i--) {
            // iterating backwards improves 1-pass optimization
            const n = nodes[i];
            if (n.optimizeNames(names, constants))
                continue;
            subtractNames(names, n.names);
            nodes.splice(i, 1);
        }
        return nodes.length > 0 ? this : undefined;
    }
    get names() {
        return this.nodes.reduce((names, n) => addNames(names, n.names), {});
    }
}
class BlockNode extends ParentNode {
    render(opts) {
        return "{" + opts._n + super.render(opts) + "}" + opts._n;
    }
}
class Root extends ParentNode {
}
class Else extends BlockNode {
}
Else.kind = "else";
class If extends BlockNode {
    constructor(condition, nodes) {
        super(nodes);
        this.condition = condition;
    }
    render(opts) {
        let code = `if(${this.condition})` + super.render(opts);
        if (this.else)
            code += "else " + this.else.render(opts);
        return code;
    }
    optimizeNodes() {
        super.optimizeNodes();
        const cond = this.condition;
        if (cond === true)
            return this.nodes; // else is ignored here
        let e = this.else;
        if (e) {
            const ns = e.optimizeNodes();
            e = this.else = Array.isArray(ns) ? new Else(ns) : ns;
        }
        if (e) {
            if (cond === false)
                return e instanceof If ? e : e.nodes;
            if (this.nodes.length)
                return this;
            return new If(not(cond), e instanceof If ? [e] : e.nodes);
        }
        if (cond === false || !this.nodes.length)
            return undefined;
        return this;
    }
    optimizeNames(names, constants) {
        var _a;
        this.else = (_a = this.else) === null || _a === void 0 ? void 0 : _a.optimizeNames(names, constants);
        if (!(super.optimizeNames(names, constants) || this.else))
            return;
        this.condition = optimizeExpr(this.condition, names, constants);
        return this;
    }
    get names() {
        const names = super.names;
        addExprNames(names, this.condition);
        if (this.else)
            addNames(names, this.else.names);
        return names;
    }
}
If.kind = "if";
class For extends BlockNode {
}
For.kind = "for";
class ForLoop extends For {
    constructor(iteration) {
        super();
        this.iteration = iteration;
    }
    render(opts) {
        return `for(${this.iteration})` + super.render(opts);
    }
    optimizeNames(names, constants) {
        if (!super.optimizeNames(names, constants))
            return;
        this.iteration = optimizeExpr(this.iteration, names, constants);
        return this;
    }
    get names() {
        return addNames(super.names, this.iteration.names);
    }
}
class ForRange extends For {
    constructor(varKind, name, from, to) {
        super();
        this.varKind = varKind;
        this.name = name;
        this.from = from;
        this.to = to;
    }
    render(opts) {
        const varKind = opts.es5 ? scope_1.varKinds.var : this.varKind;
        const { name, from, to } = this;
        return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts);
    }
    get names() {
        const names = addExprNames(super.names, this.from);
        return addExprNames(names, this.to);
    }
}
class ForIter extends For {
    constructor(loop, varKind, name, iterable) {
        super();
        this.loop = loop;
        this.varKind = varKind;
        this.name = name;
        this.iterable = iterable;
    }
    render(opts) {
        return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts);
    }
    optimizeNames(names, constants) {
        if (!super.optimizeNames(names, constants))
            return;
        this.iterable = optimizeExpr(this.iterable, names, constants);
        return this;
    }
    get names() {
        return addNames(super.names, this.iterable.names);
    }
}
class Func extends BlockNode {
    constructor(name, args, async) {
        super();
        this.name = name;
        this.args = args;
        this.async = async;
    }
    render(opts) {
        const _async = this.async ? "async " : "";
        return `${_async}function ${this.name}(${this.args})` + super.render(opts);
    }
}
Func.kind = "func";
class Return extends ParentNode {
    render(opts) {
        return "return " + super.render(opts);
    }
}
Return.kind = "return";
class Try extends BlockNode {
    render(opts) {
        let code = "try" + super.render(opts);
        if (this.catch)
            code += this.catch.render(opts);
        if (this.finally)
            code += this.finally.render(opts);
        return code;
    }
    optimizeNodes() {
        var _a, _b;
        super.optimizeNodes();
        (_a = this.catch) === null || _a === void 0 ? void 0 : _a.optimizeNodes();
        (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNodes();
        return this;
    }
    optimizeNames(names, constants) {
        var _a, _b;
        super.optimizeNames(names, constants);
        (_a = this.catch) === null || _a === void 0 ? void 0 : _a.optimizeNames(names, constants);
        (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNames(names, constants);
        return this;
    }
    get names() {
        const names = super.names;
        if (this.catch)
            addNames(names, this.catch.names);
        if (this.finally)
            addNames(names, this.finally.names);
        return names;
    }
}
class Catch extends BlockNode {
    constructor(error) {
        super();
        this.error = error;
    }
    render(opts) {
        return `catch(${this.error})` + super.render(opts);
    }
}
Catch.kind = "catch";
class Finally extends BlockNode {
    render(opts) {
        return "finally" + super.render(opts);
    }
}
Finally.kind = "finally";
class CodeGen {
    constructor(extScope, opts = {}) {
        this._values = {};
        this._blockStarts = [];
        this._constants = {};
        this.opts = { ...opts, _n: opts.lines ? "\n" : "" };
        this._extScope = extScope;
        this._scope = new scope_1.Scope({ parent: extScope });
        this._nodes = [new Root()];
    }
    toString() {
        return this._root.render(this.opts);
    }
    // returns unique name in the internal scope
    name(prefix) {
        return this._scope.name(prefix);
    }
    // reserves unique name in the external scope
    scopeName(prefix) {
        return this._extScope.name(prefix);
    }
    // reserves unique name in the external scope and assigns value to it
    scopeValue(prefixOrName, value) {
        const name = this._extScope.value(prefixOrName, value);
        const vs = this._values[name.prefix] || (this._values[name.prefix] = new Set());
        vs.add(name);
        return name;
    }
    getScopeValue(prefix, keyOrRef) {
        return this._extScope.getValue(prefix, keyOrRef);
    }
    // return code that assigns values in the external scope to the names that are used internally
    // (same names that were returned by gen.scopeName or gen.scopeValue)
    scopeRefs(scopeName) {
        return this._extScope.scopeRefs(scopeName, this._values);
    }
    scopeCode() {
        return this._extScope.scopeCode(this._values);
    }
    _def(varKind, nameOrPrefix, rhs, constant) {
        const name = this._scope.toName(nameOrPrefix);
        if (rhs !== undefined && constant)
            this._constants[name.str] = rhs;
        this._leafNode(new Def(varKind, name, rhs));
        return name;
    }
    // `const` declaration (`var` in es5 mode)
    const(nameOrPrefix, rhs, _constant) {
        return this._def(scope_1.varKinds.const, nameOrPrefix, rhs, _constant);
    }
    // `let` declaration with optional assignment (`var` in es5 mode)
    let(nameOrPrefix, rhs, _constant) {
        return this._def(scope_1.varKinds.let, nameOrPrefix, rhs, _constant);
    }
    // `var` declaration with optional assignment
    var(nameOrPrefix, rhs, _constant) {
        return this._def(scope_1.varKinds.var, nameOrPrefix, rhs, _constant);
    }
    // assignment code
    assign(lhs, rhs, sideEffects) {
        return this._leafNode(new Assign(lhs, rhs, sideEffects));
    }
    // `+=` code
    add(lhs, rhs) {
        return this._leafNode(new AssignOp(lhs, exports.operators.ADD, rhs));
    }
    // appends passed SafeExpr to code or executes Block
    code(c) {
        if (typeof c == "function")
            c();
        else if (c !== code_1.nil)
            this._leafNode(new AnyCode(c));
        return this;
    }
    // returns code for object literal for the passed argument list of key-value pairs
    object(...keyValues) {
        const code = ["{"];
        for (const [key, value] of keyValues) {
            if (code.length > 1)
                code.push(",");
            code.push(key);
            if (key !== value || this.opts.es5) {
                code.push(":");
                (0, code_1.addCodeArg)(code, value);
            }
        }
        code.push("}");
        return new code_1._Code(code);
    }
    // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed)
    if(condition, thenBody, elseBody) {
        this._blockNode(new If(condition));
        if (thenBody && elseBody) {
            this.code(thenBody).else().code(elseBody).endIf();
        }
        else if (thenBody) {
            this.code(thenBody).endIf();
        }
        else if (elseBody) {
            throw new Error('CodeGen: "else" body without "then" body');
        }
        return this;
    }
    // `else if` clause - invalid without `if` or after `else` clauses
    elseIf(condition) {
        return this._elseNode(new If(condition));
    }
    // `else` clause - only valid after `if` or `else if` clauses
    else() {
        return this._elseNode(new Else());
    }
    // end `if` statement (needed if gen.if was used only with condition)
    endIf() {
        return this._endBlockNode(If, Else);
    }
    _for(node, forBody) {
        this._blockNode(node);
        if (forBody)
            this.code(forBody).endFor();
        return this;
    }
    // a generic `for` clause (or statement if `forBody` is passed)
    for(iteration, forBody) {
        return this._for(new ForLoop(iteration), forBody);
    }
    // `for` statement for a range of values
    forRange(nameOrPrefix, from, to, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.let) {
        const name = this._scope.toName(nameOrPrefix);
        return this._for(new ForRange(varKind, name, from, to), () => forBody(name));
    }
    // `for-of` statement (in es5 mode replace with a normal for loop)
    forOf(nameOrPrefix, iterable, forBody, varKind = scope_1.varKinds.const) {
        const name = this._scope.toName(nameOrPrefix);
        if (this.opts.es5) {
            const arr = iterable instanceof code_1.Name ? iterable : this.var("_arr", iterable);
            return this.forRange("_i", 0, (0, code_1._) `${arr}.length`, (i) => {
                this.var(name, (0, code_1._) `${arr}[${i}]`);
                forBody(name);
            });
        }
        return this._for(new ForIter("of", varKind, name, iterable), () => forBody(name));
    }
    // `for-in` statement.
    // With option `ownProperties` replaced with a `for-of` loop for object keys
    forIn(nameOrPrefix, obj, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.const) {
        if (this.opts.ownProperties) {
            return this.forOf(nameOrPrefix, (0, code_1._) `Object.keys(${obj})`, forBody);
        }
        const name = this._scope.toName(nameOrPrefix);
        return this._for(new ForIter("in", varKind, name, obj), () => forBody(name));
    }
    // end `for` loop
    endFor() {
        return this._endBlockNode(For);
    }
    // `label` statement
    label(label) {
        return this._leafNode(new Label(label));
    }
    // `break` statement
    break(label) {
        return this._leafNode(new Break(label));
    }
    // `return` statement
    return(value) {
        const node = new Return();
        this._blockNode(node);
        this.code(value);
        if (node.nodes.length !== 1)
            throw new Error('CodeGen: "return" should have one node');
        return this._endBlockNode(Return);
    }
    // `try` statement
    try(tryBody, catchCode, finallyCode) {
        if (!catchCode && !finallyCode)
            throw new Error('CodeGen: "try" without "catch" and "finally"');
        const node = new Try();
        this._blockNode(node);
        this.code(tryBody);
        if (catchCode) {
            const error = this.name("e");
            this._currNode = node.catch = new Catch(error);
            catchCode(error);
        }
        if (finallyCode) {
            this._currNode = node.finally = new Finally();
            this.code(finallyCode);
        }
        return this._endBlockNode(Catch, Finally);
    }
    // `throw` statement
    throw(error) {
        return this._leafNode(new Throw(error));
    }
    // start self-balancing block
    block(body, nodeCount) {
        this._blockStarts.push(this._nodes.length);
        if (body)
            this.code(body).endBlock(nodeCount);
        return this;
    }
    // end the current self-balancing block
    endBlock(nodeCount) {
        const len = this._blockStarts.pop();
        if (len === undefined)
            throw new Error("CodeGen: not in self-balancing block");
        const toClose = this._nodes.length - len;
        if (toClose < 0 || (nodeCount !== undefined && toClose !== nodeCount)) {
            throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`);
        }
        this._nodes.length = len;
        return this;
    }
    // `function` heading (or definition if funcBody is passed)
    func(name, args = code_1.nil, async, funcBody) {
        this._blockNode(new Func(name, args, async));
        if (funcBody)
            this.code(funcBody).endFunc();
        return this;
    }
    // end function definition
    endFunc() {
        return this._endBlockNode(Func);
    }
    optimize(n = 1) {
        while (n-- > 0) {
            this._root.optimizeNodes();
            this._root.optimizeNames(this._root.names, this._constants);
        }
    }
    _leafNode(node) {
        this._currNode.nodes.push(node);
        return this;
    }
    _blockNode(node) {
        this._currNode.nodes.push(node);
        this._nodes.push(node);
    }
    _endBlockNode(N1, N2) {
        const n = this._currNode;
        if (n instanceof N1 || (N2 && n instanceof N2)) {
            this._nodes.pop();
            return this;
        }
        throw new Error(`CodeGen: not in block "${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}"`);
    }
    _elseNode(node) {
        const n = this._currNode;
        if (!(n instanceof If)) {
            throw new Error('CodeGen: "else" without "if"');
        }
        this._currNode = n.else = node;
        return this;
    }
    get _root() {
        return this._nodes[0];
    }
    get _currNode() {
        const ns = this._nodes;
        return ns[ns.length - 1];
    }
    set _currNode(node) {
        const ns = this._nodes;
        ns[ns.length - 1] = node;
    }
}
exports.CodeGen = CodeGen;
function addNames(names, from) {
    for (const n in from)
        names[n] = (names[n] || 0) + (from[n] || 0);
    return names;
}
function addExprNames(names, from) {
    return from instanceof code_1._CodeOrName ? addNames(names, from.names) : names;
}
function optimizeExpr(expr, names, constants) {
    if (expr instanceof code_1.Name)
        return replaceName(expr);
    if (!canOptimize(expr))
        return expr;
    return new code_1._Code(expr._items.reduce((items, c) => {
        if (c instanceof code_1.Name)
            c = replaceName(c);
        if (c instanceof code_1._Code)
            items.push(...c._items);
        else
            items.push(c);
        return items;
    }, []));
    function replaceName(n) {
        const c = constants[n.str];
        if (c === undefined || names[n.str] !== 1)
            return n;
        delete names[n.str];
        return c;
    }
    function canOptimize(e) {
        return (e instanceof code_1._Code &&
            e._items.some((c) => c instanceof code_1.Name && names[c.str] === 1 && constants[c.str] !== undefined));
    }
}
function subtractNames(names, from) {
    for (const n in from)
        names[n] = (names[n] || 0) - (from[n] || 0);
}
function not(x) {
    return typeof x == "boolean" || typeof x == "number" || x === null ? !x : (0, code_1._) `!${par(x)}`;
}
exports.not = not;
const andCode = mappend(exports.operators.AND);
// boolean AND (&&) expression with the passed arguments
function and(...args) {
    return args.reduce(andCode);
}
exports.and = and;
const orCode = mappend(exports.operators.OR);
// boolean OR (||) expression with the passed arguments
function or(...args) {
    return args.reduce(orCode);
}
exports.or = or;
function mappend(op) {
    return (x, y) => (x === code_1.nil ? y : y === code_1.nil ? x : (0, code_1._) `${par(x)} ${op} ${par(y)}`);
}
function par(x) {
    return x instanceof code_1.Name ? x : (0, code_1._) `(${x})`;
}
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0;
const code_1 = require("./code");
class ValueError extends Error {
    constructor(name) {
        super(`CodeGen: "code" for ${name} not defined`);
        this.value = name.value;
    }
}
var UsedValueState;
(function (UsedValueState) {
    UsedValueState[UsedValueState["Started"] = 0] = "Started";
    UsedValueState[UsedValueState["Completed"] = 1] = "Completed";
})(UsedValueState || (exports.UsedValueState = UsedValueState = {}));
exports.varKinds = {
    const: new code_1.Name("const"),
    let: new code_1.Name("let"),
    var: new code_1.Name("var"),
};
class Scope {
    constructor({ prefixes, parent } = {}) {
        this._names = {};
        this._prefixes = prefixes;
        this._parent = parent;
    }
    toName(nameOrPrefix) {
        return nameOrPrefix instanceof code_1.Name ? nameOrPrefix : this.name(nameOrPrefix);
    }
    name(prefix) {
        return new code_1.Name(this._newName(prefix));
    }
    _newName(prefix) {
        const ng = this._names[prefix] || this._nameGroup(prefix);
        return `${prefix}${ng.index++}`;
    }
    _nameGroup(prefix) {
        var _a, _b;
        if (((_b = (_a = this._parent) === null || _a === void 0 ? void 0 : _a._prefixes) === null || _b === void 0 ? void 0 : _b.has(prefix)) || (this._prefixes && !this._prefixes.has(prefix))) {
            throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`);
        }
        return (this._names[prefix] = { prefix, index: 0 });
    }
}
exports.Scope = Scope;
class ValueScopeName extends code_1.Name {
    constructor(prefix, nameStr) {
        super(nameStr);
        this.prefix = prefix;
    }
    setValue(value, { property, itemIndex }) {
        this.value = value;
        this.scopePath = (0, code_1._) `.${new code_1.Name(property)}[${itemIndex}]`;
    }
}
exports.ValueScopeName = ValueScopeName;
const line = (0, code_1._) `\n`;
class ValueScope extends Scope {
    constructor(opts) {
        super(opts);
        this._values = {};
        this._scope = opts.scope;
        this.opts = { ...opts, _n: opts.lines ? line : code_1.nil };
    }
    get() {
        return this._scope;
    }
    name(prefix) {
        return new ValueScopeName(prefix, this._newName(prefix));
    }
    value(nameOrPrefix, value) {
        var _a;
        if (value.ref === undefined)
            throw new Error("CodeGen: ref must be passed in value");
        const name = this.toName(nameOrPrefix);
        const { prefix } = name;
        const valueKey = (_a = value.key) !== null && _a !== void 0 ? _a : value.ref;
        let vs = this._values[prefix];
        if (vs) {
            const _name = vs.get(valueKey);
            if (_name)
                return _name;
        }
        else {
            vs = this._values[prefix] = new Map();
        }
        vs.set(valueKey, name);
        const s = this._scope[prefix] || (this._scope[prefix] = []);
        const itemIndex = s.length;
        s[itemIndex] = value.ref;
        name.setValue(value, { property: prefix, itemIndex });
        return name;
    }
    getValue(prefix, keyOrRef) {
        const vs = this._values[prefix];
        if (!vs)
            return;
        return vs.get(keyOrRef);
    }
    scopeRefs(scopeName, values = this._values) {
        return this._reduceValues(values, (name) => {
            if (name.scopePath === undefined)
                throw new Error(`CodeGen: name "${name}" has no value`);
            return (0, code_1._) `${scopeName}${name.scopePath}`;
        });
    }
    scopeCode(values = this._values, usedValues, getCode) {
        return this._reduceValues(values, (name) => {
            if (name.value === undefined)
                throw new Error(`CodeGen: name "${name}" has no value`);
            return name.value.code;
        }, usedValues, getCode);
    }
    _reduceValues(values, valueCode, usedValues = {}, getCode) {
        let code = code_1.nil;
        for (const prefix in values) {
            const vs = values[prefix];
            if (!vs)
                continue;
            const nameSet = (usedValues[prefix] = usedValues[prefix] || new Map());
            vs.forEach((name) => {
                if (nameSet.has(name))
                    return;
                nameSet.set(name, UsedValueState.Started);
                let c = valueCode(name);
                if (c) {
                    const def = this.opts.es5 ? exports.varKinds.var : exports.varKinds.const;
                    code = (0, code_1._) `${code}${def} ${name} = ${c};${this.opts._n}`;
                }
                else if ((c = getCode === null || getCode === void 0 ? void 0 : getCode(name))) {
                    code = (0, code_1._) `${code}${c}${this.opts._n}`;
                }
                else {
                    throw new ValueError(name);
                }
                nameSet.set(name, UsedValueState.Completed);
            });
        }
        return code;
    }
}
exports.ValueScope = ValueScope;
//# sourceMappingURL=scope.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0;
const codegen_1 = require("./codegen");
const util_1 = require("./util");
const names_1 = require("./names");
exports.keywordError = {
    message: ({ keyword }) => (0, codegen_1.str) `must pass "${keyword}" keyword validation`,
};
exports.keyword$DataError = {
    message: ({ keyword, schemaType }) => schemaType
        ? (0, codegen_1.str) `"${keyword}" keyword must be ${schemaType} ($data)`
        : (0, codegen_1.str) `"${keyword}" keyword is invalid ($data)`,
};
function reportError(cxt, error = exports.keywordError, errorPaths, overrideAllErrors) {
    const { it } = cxt;
    const { gen, compositeRule, allErrors } = it;
    const errObj = errorObjectCode(cxt, error, errorPaths);
    if (overrideAllErrors !== null && overrideAllErrors !== void 0 ? overrideAllErrors : (compositeRule || allErrors)) {
        addError(gen, errObj);
    }
    else {
        returnErrors(it, (0, codegen_1._) `[${errObj}]`);
    }
}
exports.reportError = reportError;
function reportExtraError(cxt, error = exports.keywordError, errorPaths) {
    const { it } = cxt;
    const { gen, compositeRule, allErrors } = it;
    const errObj = errorObjectCode(cxt, error, errorPaths);
    addError(gen, errObj);
    if (!(compositeRule || allErrors)) {
        returnErrors(it, names_1.default.vErrors);
    }
}
exports.reportExtraError = reportExtraError;
function resetErrorsCount(gen, errsCount) {
    gen.assign(names_1.default.errors, errsCount);
    gen.if((0, codegen_1._) `${names_1.default.vErrors} !== null`, () => gen.if(errsCount, () => gen.assign((0, codegen_1._) `${names_1.default.vErrors}.length`, errsCount), () => gen.assign(names_1.default.vErrors, null)));
}
exports.resetErrorsCount = resetErrorsCount;
function extendErrors({ gen, keyword, schemaValue, data, errsCount, it, }) {
    /* istanbul ignore if */
    if (errsCount === undefined)
        throw new Error("ajv implementation error");
    const err = gen.name("err");
    gen.forRange("i", errsCount, names_1.default.errors, (i) => {
        gen.const(err, (0, codegen_1._) `${names_1.default.vErrors}[${i}]`);
        gen.if((0, codegen_1._) `${err}.instancePath === undefined`, () => gen.assign((0, codegen_1._) `${err}.instancePath`, (0, codegen_1.strConcat)(names_1.default.instancePath, it.errorPath)));
        gen.assign((0, codegen_1._) `${err}.schemaPath`, (0, codegen_1.str) `${it.errSchemaPath}/${keyword}`);
        if (it.opts.verbose) {
            gen.assign((0, codegen_1._) `${err}.schema`, schemaValue);
            gen.assign((0, codegen_1._) `${err}.data`, data);
        }
    });
}
exports.extendErrors = extendErrors;
function addError(gen, errObj) {
    const err = gen.const("err", errObj);
    gen.if((0, codegen_1._) `${names_1.default.vErrors} === null`, () => gen.assign(names_1.default.vErrors, (0, codegen_1._) `[${err}]`), (0, codegen_1._) `${names_1.default.vErrors}.push(${err})`);
    gen.code((0, codegen_1._) `${names_1.default.errors}++`);
}
function returnErrors(it, errs) {
    const { gen, validateName, schemaEnv } = it;
    if (schemaEnv.$async) {
        gen.throw((0, codegen_1._) `new ${it.ValidationError}(${errs})`);
    }
    else {
        gen.assign((0, codegen_1._) `${validateName}.errors`, errs);
        gen.return(false);
    }
}
const E = {
    keyword: new codegen_1.Name("keyword"),
    schemaPath: new codegen_1.Name("schemaPath"), // also used in JTD errors
    params: new codegen_1.Name("params"),
    propertyName: new codegen_1.Name("propertyName"),
    message: new codegen_1.Name("message"),
    schema: new codegen_1.Name("schema"),
    parentSchema: new codegen_1.Name("parentSchema"),
};
function errorObjectCode(cxt, error, errorPaths) {
    const { createErrors } = cxt.it;
    if (createErrors === false)
        return (0, codegen_1._) `{}`;
    return errorObject(cxt, error, errorPaths);
}
function errorObject(cxt, error, errorPaths = {}) {
    const { gen, it } = cxt;
    const keyValues = [
        errorInstancePath(it, errorPaths),
        errorSchemaPath(cxt, errorPaths),
    ];
    extraErrorProps(cxt, error, keyValues);
    return gen.object(...keyValues);
}
function errorInstancePath({ errorPath }, { instancePath }) {
    const instPath = instancePath
        ? (0, codegen_1.str) `${errorPath}${(0, util_1.getErrorPath)(instancePath, util_1.Type.Str)}`
        : errorPath;
    return [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, instPath)];
}
function errorSchemaPath({ keyword, it: { errSchemaPath } }, { schemaPath, parentSchema }) {
    let schPath = parentSchema ? errSchemaPath : (0, codegen_1.str) `${errSchemaPath}/${keyword}`;
    if (schemaPath) {
        schPath = (0, codegen_1.str) `${schPath}${(0, util_1.getErrorPath)(schemaPath, util_1.Type.Str)}`;
    }
    return [E.schemaPath, schPath];
}
function extraErrorProps(cxt, { params, message }, keyValues) {
    const { keyword, data, schemaValue, it } = cxt;
    const { opts, propertyName, topSchemaRef, schemaPath } = it;
    keyValues.push([E.keyword, keyword], [E.params, typeof params == "function" ? params(cxt) : params || (0, codegen_1._) `{}`]);
    if (opts.messages) {
        keyValues.push([E.message, typeof message == "function" ? message(cxt) : message]);
    }
    if (opts.verbose) {
        keyValues.push([E.schema, schemaValue], [E.parentSchema, (0, codegen_1._) `${topSchemaRef}${schemaPath}`], [names_1.default.data, data]);
    }
    if (propertyName)
        keyValues.push([E.propertyName, propertyName]);
}
//# sourceMappingURL=errors.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0;
const codegen_1 = require("./codegen");
const validation_error_1 = require("../runtime/validation_error");
const names_1 = require("./names");
const resolve_1 = require("./resolve");
const util_1 = require("./util");
const validate_1 = require("./validate");
class SchemaEnv {
    constructor(env) {
        var _a;
        this.refs = {};
        this.dynamicAnchors = {};
        let schema;
        if (typeof env.schema == "object")
            schema = env.schema;
        this.schema = env.schema;
        this.schemaId = env.schemaId;
        this.root = env.root || this;
        this.baseId = (_a = env.baseId) !== null && _a !== void 0 ? _a : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env.schemaId || "$id"]);
        this.schemaPath = env.schemaPath;
        this.localRefs = env.localRefs;
        this.meta = env.meta;
        this.$async = schema === null || schema === void 0 ? void 0 : schema.$async;
        this.refs = {};
    }
}
exports.SchemaEnv = SchemaEnv;
// let codeSize = 0
// let nodeCount = 0
// Compiles schema in SchemaEnv
function compileSchema(sch) {
    // TODO refactor - remove compilations
    const _sch = getCompilingSchema.call(this, sch);
    if (_sch)
        return _sch;
    const rootId = (0, resolve_1.getFullPath)(this.opts.uriResolver, sch.root.baseId); // TODO if getFullPath removed 1 tests fails
    const { es5, lines } = this.opts.code;
    const { ownProperties } = this.opts;
    const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties });
    let _ValidationError;
    if (sch.$async) {
        _ValidationError = gen.scopeValue("Error", {
            ref: validation_error_1.default,
            code: (0, codegen_1._) `require("ajv/dist/runtime/validation_error").default`,
        });
    }
    const validateName = gen.scopeName("validate");
    sch.validateName = validateName;
    const schemaCxt = {
        gen,
        allErrors: this.opts.allErrors,
        data: names_1.default.data,
        parentData: names_1.default.parentData,
        parentDataProperty: names_1.default.parentDataProperty,
        dataNames: [names_1.default.data],
        dataPathArr: [codegen_1.nil], // TODO can its length be used as dataLevel if nil is removed?
        dataLevel: 0,
        dataTypes: [],
        definedProperties: new Set(),
        topSchemaRef: gen.scopeValue("schema", this.opts.code.source === true
            ? { ref: sch.schema, code: (0, codegen_1.stringify)(sch.schema) }
            : { ref: sch.schema }),
        validateName,
        ValidationError: _ValidationError,
        schema: sch.schema,
        schemaEnv: sch,
        rootId,
        baseId: sch.baseId || rootId,
        schemaPath: codegen_1.nil,
        errSchemaPath: sch.schemaPath || (this.opts.jtd ? "" : "#"),
        errorPath: (0, codegen_1._) `""`,
        opts: this.opts,
        self: this,
    };
    let sourceCode;
    try {
        this._compilations.add(sch);
        (0, validate_1.validateFunctionCode)(schemaCxt);
        gen.optimize(this.opts.code.optimize);
        // gen.optimize(1)
        const validateCode = gen.toString();
        sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${validateCode}`;
        // console.log((codeSize += sourceCode.length), (nodeCount += gen.nodeCount))
        if (this.opts.code.process)
            sourceCode = this.opts.code.process(sourceCode, sch);
        // console.log("\n\n\n *** \n", sourceCode)
        const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode);
        const validate = makeValidate(this, this.scope.get());
        this.scope.value(validateName, { ref: validate });
        validate.errors = null;
        validate.schema = sch.schema;
        validate.schemaEnv = sch;
        if (sch.$async)
            validate.$async = true;
        if (this.opts.code.source === true) {
            validate.source = { validateName, validateCode, scopeValues: gen._values };
        }
        if (this.opts.unevaluated) {
            const { props, items } = schemaCxt;
            validate.evaluated = {
                props: props instanceof codegen_1.Name ? undefined : props,
                items: items instanceof codegen_1.Name ? undefined : items,
                dynamicProps: props instanceof codegen_1.Name,
                dynamicItems: items instanceof codegen_1.Name,
            };
            if (validate.source)
                validate.source.evaluated = (0, codegen_1.stringify)(validate.evaluated);
        }
        sch.validate = validate;
        return sch;
    }
    catch (e) {
        delete sch.validate;
        delete sch.validateName;
        if (sourceCode)
            this.logger.error("Error compiling schema, function code:", sourceCode);
        // console.log("\n\n\n *** \n", sourceCode, this.opts)
        throw e;
    }
    finally {
        this._compilations.delete(sch);
    }
}
exports.compileSchema = compileSchema;
function resolveRef(root, baseId, ref) {
    var _a;
    ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref);
    const schOrFunc = root.refs[ref];
    if (schOrFunc)
        return schOrFunc;
    let _sch = resolve.call(this, root, ref);
    if (_sch === undefined) {
        const schema = (_a = root.localRefs) === null || _a === void 0 ? void 0 : _a[ref]; // TODO maybe localRefs should hold SchemaEnv
        const { schemaId } = this.opts;
        if (schema)
            _sch = new SchemaEnv({ schema, schemaId, root, baseId });
    }
    if (_sch === undefined)
        return;
    return (root.refs[ref] = inlineOrCompile.call(this, _sch));
}
exports.resolveRef = resolveRef;
function inlineOrCompile(sch) {
    if ((0, resolve_1.inlineRef)(sch.schema, this.opts.inlineRefs))
        return sch.schema;
    return sch.validate ? sch : compileSchema.call(this, sch);
}
// Index of schema compilation in the currently compiled list
function getCompilingSchema(schEnv) {
    for (const sch of this._compilations) {
        if (sameSchemaEnv(sch, schEnv))
            return sch;
    }
}
exports.getCompilingSchema = getCompilingSchema;
function sameSchemaEnv(s1, s2) {
    return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
}
// resolve and compile the references ($ref)
// TODO returns AnySchemaObject (if the schema can be inlined) or validation function
function resolve(root, // information about the root schema for the current schema
ref // reference to resolve
) {
    let sch;
    while (typeof (sch = this.refs[ref]) == "string")
        ref = sch;
    return sch || this.schemas[ref] || resolveSchema.call(this, root, ref);
}
// Resolve schema, its root and baseId
function resolveSchema(root, // root object with properties schema, refs TODO below SchemaEnv is assigned to it
ref // reference to resolve
) {
    const p = this.opts.uriResolver.parse(ref);
    const refPath = (0, resolve_1._getFullPath)(this.opts.uriResolver, p);
    let baseId = (0, resolve_1.getFullPath)(this.opts.uriResolver, root.baseId, undefined);
    // TODO `Object.keys(root.schema).length > 0` should not be needed - but removing breaks 2 tests
    if (Object.keys(root.schema).length > 0 && refPath === baseId) {
        return getJsonPointer.call(this, p, root);
    }
    const id = (0, resolve_1.normalizeId)(refPath);
    const schOrRef = this.refs[id] || this.schemas[id];
    if (typeof schOrRef == "string") {
        const sch = resolveSchema.call(this, root, schOrRef);
        if (typeof (sch === null || sch === void 0 ? void 0 : sch.schema) !== "object")
            return;
        return getJsonPointer.call(this, p, sch);
    }
    if (typeof (schOrRef === null || schOrRef === void 0 ? void 0 : schOrRef.schema) !== "object")
        return;
    if (!schOrRef.validate)
        compileSchema.call(this, schOrRef);
    if (id === (0, resolve_1.normalizeId)(ref)) {
        const { schema } = schOrRef;
        const { schemaId } = this.opts;
        const schId = schema[schemaId];
        if (schId)
            baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId);
        return new SchemaEnv({ schema, schemaId, root, baseId });
    }
    return getJsonPointer.call(this, p, schOrRef);
}
exports.resolveSchema = resolveSchema;
const PREVENT_SCOPE_CHANGE = new Set([
    "properties",
    "patternProperties",
    "enum",
    "dependencies",
    "definitions",
]);
function getJsonPointer(parsedRef, { baseId, schema, root }) {
    var _a;
    if (((_a = parsedRef.fragment) === null || _a === void 0 ? void 0 : _a[0]) !== "/")
        return;
    for (const part of parsedRef.fragment.slice(1).split("/")) {
        if (typeof schema === "boolean")
            return;
        const partSchema = schema[(0, util_1.unescapeFragment)(part)];
        if (partSchema === undefined)
            return;
        schema = partSchema;
        // TODO PREVENT_SCOPE_CHANGE could be defined in keyword def?
        const schId = typeof schema === "object" && schema[this.opts.schemaId];
        if (!PREVENT_SCOPE_CHANGE.has(part) && schId) {
            baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId);
        }
    }
    let env;
    if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) {
        const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref);
        env = resolveSchema.call(this, root, $ref);
    }
    // even though resolution failed we need to return SchemaEnv to throw exception
    // so that compileAsync loads missing schema.
    const { schemaId } = this.opts;
    env = env || new SchemaEnv({ schema, schemaId, root, baseId });
    if (env.schema !== env.root.schema)
        return env;
    return undefined;
}
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = require("./types");
const __1 = require("..");
const codegen_1 = require("../codegen");
const ref_error_1 = require("../ref_error");
const names_1 = require("../names");
const code_1 = require("../../vocabularies/code");
const ref_1 = require("../../vocabularies/jtd/ref");
const type_1 = require("../../vocabularies/jtd/type");
const parseJson_1 = require("../../runtime/parseJson");
const util_1 = require("../util");
const timestamp_1 = require("../../runtime/timestamp");
const genParse = {
    elements: parseElements,
    values: parseValues,
    discriminator: parseDiscriminator,
    properties: parseProperties,
    optionalProperties: parseProperties,
    enum: parseEnum,
    type: parseType,
    ref: parseRef,
};
function compileParser(sch, definitions) {
    const _sch = __1.getCompilingSchema.call(this, sch);
    if (_sch)
        return _sch;
    const { es5, lines } = this.opts.code;
    const { ownProperties } = this.opts;
    const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties });
    const parseName = gen.scopeName("parse");
    const cxt = {
        self: this,
        gen,
        schema: sch.schema,
        schemaEnv: sch,
        definitions,
        data: names_1.default.data,
        parseName,
        char: gen.name("c"),
    };
    let sourceCode;
    try {
        this._compilations.add(sch);
        sch.parseName = parseName;
        parserFunction(cxt);
        gen.optimize(this.opts.code.optimize);
        const parseFuncCode = gen.toString();
        sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${parseFuncCode}`;
        const makeParse = new Function(`${names_1.default.scope}`, sourceCode);
        const parse = makeParse(this.scope.get());
        this.scope.value(parseName, { ref: parse });
        sch.parse = parse;
    }
    catch (e) {
        if (sourceCode)
            this.logger.error("Error compiling parser, function code:", sourceCode);
        delete sch.parse;
        delete sch.parseName;
        throw e;
    }
    finally {
        this._compilations.delete(sch);
    }
    return sch;
}
exports.default = compileParser;
const undef = (0, codegen_1._) `undefined`;
function parserFunction(cxt) {
    const { gen, parseName, char } = cxt;
    gen.func(parseName, (0, codegen_1._) `${names_1.default.json}, ${names_1.default.jsonPos}, ${names_1.default.jsonPart}`, false, () => {
        gen.let(names_1.default.data);
        gen.let(char);
        gen.assign((0, codegen_1._) `${parseName}.message`, undef);
        gen.assign((0, codegen_1._) `${parseName}.position`, undef);
        gen.assign(names_1.default.jsonPos, (0, codegen_1._) `${names_1.default.jsonPos} || 0`);
        gen.const(names_1.default.jsonLen, (0, codegen_1._) `${names_1.default.json}.length`);
        parseCode(cxt);
        skipWhitespace(cxt);
        gen.if(names_1.default.jsonPart, () => {
            gen.assign((0, codegen_1._) `${parseName}.position`, names_1.default.jsonPos);
            gen.return(names_1.default.data);
        });
        gen.if((0, codegen_1._) `${names_1.default.jsonPos} === ${names_1.default.jsonLen}`, () => gen.return(names_1.default.data));
        jsonSyntaxError(cxt);
    });
}
function parseCode(cxt) {
    let form;
    for (const key of types_1.jtdForms) {
        if (key in cxt.schema) {
            form = key;
            break;
        }
    }
    if (form)
        parseNullable(cxt, genParse[form]);
    else
        parseEmpty(cxt);
}
const parseBoolean = parseBooleanToken(true, parseBooleanToken(false, jsonSyntaxError));
function parseNullable(cxt, parseForm) {
    const { gen, schema, data } = cxt;
    if (!schema.nullable)
        return parseForm(cxt);
    tryParseToken(cxt, "null", parseForm, () => gen.assign(data, null));
}
function parseElements(cxt) {
    const { gen, schema, data } = cxt;
    parseToken(cxt, "[");
    const ix = gen.let("i", 0);
    gen.assign(data, (0, codegen_1._) `[]`);
    parseItems(cxt, "]", () => {
        const el = gen.let("el");
        parseCode({ ...cxt, schema: schema.elements, data: el });
        gen.assign((0, codegen_1._) `${data}[${ix}++]`, el);
    });
}
function parseValues(cxt) {
    const { gen, schema, data } = cxt;
    parseToken(cxt, "{");
    gen.assign(data, (0, codegen_1._) `{}`);
    parseItems(cxt, "}", () => parseKeyValue(cxt, schema.values));
}
function parseItems(cxt, endToken, block) {
    tryParseItems(cxt, endToken, block);
    parseToken(cxt, endToken);
}
function tryParseItems(cxt, endToken, block) {
    const { gen } = cxt;
    gen.for((0, codegen_1._) `;${names_1.default.jsonPos}<${names_1.default.jsonLen} && ${jsonSlice(1)}!==${endToken};`, () => {
        block();
        tryParseToken(cxt, ",", () => gen.break(), hasItem);
    });
    function hasItem() {
        tryParseToken(cxt, endToken, () => { }, jsonSyntaxError);
    }
}
function parseKeyValue(cxt, schema) {
    const { gen } = cxt;
    const key = gen.let("key");
    parseString({ ...cxt, data: key });
    parseToken(cxt, ":");
    parsePropertyValue(cxt, key, schema);
}
function parseDiscriminator(cxt) {
    const { gen, data, schema } = cxt;
    const { discriminator, mapping } = schema;
    parseToken(cxt, "{");
    gen.assign(data, (0, codegen_1._) `{}`);
    const startPos = gen.const("pos", names_1.default.jsonPos);
    const value = gen.let("value");
    const tag = gen.let("tag");
    tryParseItems(cxt, "}", () => {
        const key = gen.let("key");
        parseString({ ...cxt, data: key });
        parseToken(cxt, ":");
        gen.if((0, codegen_1._) `${key} === ${discriminator}`, () => {
            parseString({ ...cxt, data: tag });
            gen.assign((0, codegen_1._) `${data}[${key}]`, tag);
            gen.break();
        }, () => parseEmpty({ ...cxt, data: value }) // can be discarded/skipped
        );
    });
    gen.assign(names_1.default.jsonPos, startPos);
    gen.if((0, codegen_1._) `${tag} === undefined`);
    parsingError(cxt, (0, codegen_1.str) `discriminator tag not found`);
    for (const tagValue in mapping) {
        gen.elseIf((0, codegen_1._) `${tag} === ${tagValue}`);
        parseSchemaProperties({ ...cxt, schema: mapping[tagValue] }, discriminator);
    }
    gen.else();
    parsingError(cxt, (0, codegen_1.str) `discriminator value not in schema`);
    gen.endIf();
}
function parseProperties(cxt) {
    const { gen, data } = cxt;
    parseToken(cxt, "{");
    gen.assign(data, (0, codegen_1._) `{}`);
    parseSchemaProperties(cxt);
}
function parseSchemaProperties(cxt, discriminator) {
    const { gen, schema, data } = cxt;
    const { properties, optionalProperties, additionalProperties } = schema;
    parseItems(cxt, "}", () => {
        const key = gen.let("key");
        parseString({ ...cxt, data: key });
        parseToken(cxt, ":");
        gen.if(false);
        parseDefinedProperty(cxt, key, properties);
        parseDefinedProperty(cxt, key, optionalProperties);
        if (discriminator) {
            gen.elseIf((0, codegen_1._) `${key} === ${discriminator}`);
            const tag = gen.let("tag");
            parseString({ ...cxt, data: tag }); // can be discarded, it is already assigned
        }
        gen.else();
        if (additionalProperties) {
            parseEmpty({ ...cxt, data: (0, codegen_1._) `${data}[${key}]` });
        }
        else {
            parsingError(cxt, (0, codegen_1.str) `property ${key} not allowed`);
        }
        gen.endIf();
    });
    if (properties) {
        const hasProp = (0, code_1.hasPropFunc)(gen);
        const allProps = (0, codegen_1.and)(...Object.keys(properties).map((p) => (0, codegen_1._) `${hasProp}.call(${data}, ${p})`));
        gen.if((0, codegen_1.not)(allProps), () => parsingError(cxt, (0, codegen_1.str) `missing required properties`));
    }
}
function parseDefinedProperty(cxt, key, schemas = {}) {
    const { gen } = cxt;
    for (const prop in schemas) {
        gen.elseIf((0, codegen_1._) `${key} === ${prop}`);
        parsePropertyValue(cxt, key, schemas[prop]);
    }
}
function parsePropertyValue(cxt, key, schema) {
    parseCode({ ...cxt, schema, data: (0, codegen_1._) `${cxt.data}[${key}]` });
}
function parseType(cxt) {
    const { gen, schema, data, self } = cxt;
    switch (schema.type) {
        case "boolean":
            parseBoolean(cxt);
            break;
        case "string":
            parseString(cxt);
            break;
        case "timestamp": {
            parseString(cxt);
            const vts = (0, util_1.useFunc)(gen, timestamp_1.default);
            const { allowDate, parseDate } = self.opts;
            const notValid = allowDate ? (0, codegen_1._) `!${vts}(${data}, true)` : (0, codegen_1._) `!${vts}(${data})`;
            const fail = parseDate
                ? (0, codegen_1.or)(notValid, (0, codegen_1._) `(${data} = new Date(${data}), false)`, (0, codegen_1._) `isNaN(${data}.valueOf())`)
                : notValid;
            gen.if(fail, () => parsingError(cxt, (0, codegen_1.str) `invalid timestamp`));
            break;
        }
        case "float32":
        case "float64":
            parseNumber(cxt);
            break;
        default: {
            const t = schema.type;
            if (!self.opts.int32range && (t === "int32" || t === "uint32")) {
                parseNumber(cxt, 16); // 2 ** 53 - max safe integer
                if (t === "uint32") {
                    gen.if((0, codegen_1._) `${data} < 0`, () => parsingError(cxt, (0, codegen_1.str) `integer out of range`));
                }
            }
            else {
                const [min, max, maxDigits] = type_1.intRange[t];
                parseNumber(cxt, maxDigits);
                gen.if((0, codegen_1._) `${data} < ${min} || ${data} > ${max}`, () => parsingError(cxt, (0, codegen_1.str) `integer out of range`));
            }
        }
    }
}
function parseString(cxt) {
    parseToken(cxt, '"');
    parseWith(cxt, parseJson_1.parseJsonString);
}
function parseEnum(cxt) {
    const { gen, data, schema } = cxt;
    const enumSch = schema.enum;
    parseToken(cxt, '"');
    // TODO loopEnum
    gen.if(false);
    for (const value of enumSch) {
        const valueStr = JSON.stringify(value).slice(1); // remove starting quote
        gen.elseIf((0, codegen_1._) `${jsonSlice(valueStr.length)} === ${valueStr}`);
        gen.assign(data, (0, codegen_1.str) `${value}`);
        gen.add(names_1.default.jsonPos, valueStr.length);
    }
    gen.else();
    jsonSyntaxError(cxt);
    gen.endIf();
}
function parseNumber(cxt, maxDigits) {
    const { gen } = cxt;
    skipWhitespace(cxt);
    gen.if((0, codegen_1._) `"-0123456789".indexOf(${jsonSlice(1)}) < 0`, () => jsonSyntaxError(cxt), () => parseWith(cxt, parseJson_1.parseJsonNumber, maxDigits));
}
function parseBooleanToken(bool, fail) {
    return (cxt) => {
        const { gen, data } = cxt;
        tryParseToken(cxt, `${bool}`, () => fail(cxt), () => gen.assign(data, bool));
    };
}
function parseRef(cxt) {
    const { gen, self, definitions, schema, schemaEnv } = cxt;
    const { ref } = schema;
    const refSchema = definitions[ref];
    if (!refSchema)
        throw new ref_error_1.default(self.opts.uriResolver, "", ref, `No definition ${ref}`);
    if (!(0, ref_1.hasRef)(refSchema))
        return parseCode({ ...cxt, schema: refSchema });
    const { root } = schemaEnv;
    const sch = compileParser.call(self, new __1.SchemaEnv({ schema: refSchema, root }), definitions);
    partialParse(cxt, getParser(gen, sch), true);
}
function getParser(gen, sch) {
    return sch.parse
        ? gen.scopeValue("parse", { ref: sch.parse })
        : (0, codegen_1._) `${gen.scopeValue("wrapper", { ref: sch })}.parse`;
}
function parseEmpty(cxt) {
    parseWith(cxt, parseJson_1.parseJson);
}
function parseWith(cxt, parseFunc, args) {
    partialParse(cxt, (0, util_1.useFunc)(cxt.gen, parseFunc), args);
}
function partialParse(cxt, parseFunc, args) {
    const { gen, data } = cxt;
    gen.assign(data, (0, codegen_1._) `${parseFunc}(${names_1.default.json}, ${names_1.default.jsonPos}${args ? (0, codegen_1._) `, ${args}` : codegen_1.nil})`);
    gen.assign(names_1.default.jsonPos, (0, codegen_1._) `${parseFunc}.position`);
    gen.if((0, codegen_1._) `${data} === undefined`, () => parsingError(cxt, (0, codegen_1._) `${parseFunc}.message`));
}
function parseToken(cxt, tok) {
    tryParseToken(cxt, tok, jsonSyntaxError);
}
function tryParseToken(cxt, tok, fail, success) {
    const { gen } = cxt;
    const n = tok.length;
    skipWhitespace(cxt);
    gen.if((0, codegen_1._) `${jsonSlice(n)} === ${tok}`, () => {
        gen.add(names_1.default.jsonPos, n);
        success === null || success === void 0 ? void 0 : success(cxt);
    }, () => fail(cxt));
}
function skipWhitespace({ gen, char: c }) {
    gen.code((0, codegen_1._) `while((${c}=${names_1.default.json}[${names_1.default.jsonPos}],${c}===" "||${c}==="\\n"||${c}==="\\r"||${c}==="\\t"))${names_1.default.jsonPos}++;`);
}
function jsonSlice(len) {
    return len === 1
        ? (0, codegen_1._) `${names_1.default.json}[${names_1.default.jsonPos}]`
        : (0, codegen_1._) `${names_1.default.json}.slice(${names_1.default.jsonPos}, ${names_1.default.jsonPos}+${len})`;
}
function jsonSyntaxError(cxt) {
    parsingError(cxt, (0, codegen_1._) `"unexpected token " + ${names_1.default.json}[${names_1.default.jsonPos}]`);
}
function parsingError({ gen, parseName }, msg) {
    gen.assign((0, codegen_1._) `${parseName}.message`, msg);
    gen.assign((0, codegen_1._) `${parseName}.position`, names_1.default.jsonPos);
    gen.return(undef);
}
//# sourceMappingURL=parse.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = require("./types");
const __1 = require("..");
const codegen_1 = require("../codegen");
const ref_error_1 = require("../ref_error");
const names_1 = require("../names");
const code_1 = require("../../vocabularies/code");
const ref_1 = require("../../vocabularies/jtd/ref");
const util_1 = require("../util");
const quote_1 = require("../../runtime/quote");
const genSerialize = {
    elements: serializeElements,
    values: serializeValues,
    discriminator: serializeDiscriminator,
    properties: serializeProperties,
    optionalProperties: serializeProperties,
    enum: serializeString,
    type: serializeType,
    ref: serializeRef,
};
function compileSerializer(sch, definitions) {
    const _sch = __1.getCompilingSchema.call(this, sch);
    if (_sch)
        return _sch;
    const { es5, lines } = this.opts.code;
    const { ownProperties } = this.opts;
    const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties });
    const serializeName = gen.scopeName("serialize");
    const cxt = {
        self: this,
        gen,
        schema: sch.schema,
        schemaEnv: sch,
        definitions,
        data: names_1.default.data,
    };
    let sourceCode;
    try {
        this._compilations.add(sch);
        sch.serializeName = serializeName;
        gen.func(serializeName, names_1.default.data, false, () => {
            gen.let(names_1.default.json, (0, codegen_1.str) ``);
            serializeCode(cxt);
            gen.return(names_1.default.json);
        });
        gen.optimize(this.opts.code.optimize);
        const serializeFuncCode = gen.toString();
        sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${serializeFuncCode}`;
        const makeSerialize = new Function(`${names_1.default.scope}`, sourceCode);
        const serialize = makeSerialize(this.scope.get());
        this.scope.value(serializeName, { ref: serialize });
        sch.serialize = serialize;
    }
    catch (e) {
        if (sourceCode)
            this.logger.error("Error compiling serializer, function code:", sourceCode);
        delete sch.serialize;
        delete sch.serializeName;
        throw e;
    }
    finally {
        this._compilations.delete(sch);
    }
    return sch;
}
exports.default = compileSerializer;
function serializeCode(cxt) {
    let form;
    for (const key of types_1.jtdForms) {
        if (key in cxt.schema) {
            form = key;
            break;
        }
    }
    serializeNullable(cxt, form ? genSerialize[form] : serializeEmpty);
}
function serializeNullable(cxt, serializeForm) {
    const { gen, schema, data } = cxt;
    if (!schema.nullable)
        return serializeForm(cxt);
    gen.if((0, codegen_1._) `${data} === undefined || ${data} === null`, () => gen.add(names_1.default.json, (0, codegen_1._) `"null"`), () => serializeForm(cxt));
}
function serializeElements(cxt) {
    const { gen, schema, data } = cxt;
    gen.add(names_1.default.json, (0, codegen_1.str) `[`);
    const first = gen.let("first", true);
    gen.forOf("el", data, (el) => {
        addComma(cxt, first);
        serializeCode({ ...cxt, schema: schema.elements, data: el });
    });
    gen.add(names_1.default.json, (0, codegen_1.str) `]`);
}
function serializeValues(cxt) {
    const { gen, schema, data } = cxt;
    gen.add(names_1.default.json, (0, codegen_1.str) `{`);
    const first = gen.let("first", true);
    gen.forIn("key", data, (key) => serializeKeyValue(cxt, key, schema.values, first));
    gen.add(names_1.default.json, (0, codegen_1.str) `}`);
}
function serializeKeyValue(cxt, key, schema, first) {
    const { gen, data } = cxt;
    addComma(cxt, first);
    serializeString({ ...cxt, data: key });
    gen.add(names_1.default.json, (0, codegen_1.str) `:`);
    const value = gen.const("value", (0, codegen_1._) `${data}${(0, codegen_1.getProperty)(key)}`);
    serializeCode({ ...cxt, schema, data: value });
}
function serializeDiscriminator(cxt) {
    const { gen, schema, data } = cxt;
    const { discriminator } = schema;
    gen.add(names_1.default.json, (0, codegen_1.str) `{${JSON.stringify(discriminator)}:`);
    const tag = gen.const("tag", (0, codegen_1._) `${data}${(0, codegen_1.getProperty)(discriminator)}`);
    serializeString({ ...cxt, data: tag });
    gen.if(false);
    for (const tagValue in schema.mapping) {
        gen.elseIf((0, codegen_1._) `${tag} === ${tagValue}`);
        const sch = schema.mapping[tagValue];
        serializeSchemaProperties({ ...cxt, schema: sch }, discriminator);
    }
    gen.endIf();
    gen.add(names_1.default.json, (0, codegen_1.str) `}`);
}
function serializeProperties(cxt) {
    const { gen } = cxt;
    gen.add(names_1.default.json, (0, codegen_1.str) `{`);
    serializeSchemaProperties(cxt);
    gen.add(names_1.default.json, (0, codegen_1.str) `}`);
}
function serializeSchemaProperties(cxt, discriminator) {
    const { gen, schema, data } = cxt;
    const { properties, optionalProperties } = schema;
    const props = keys(properties);
    const optProps = keys(optionalProperties);
    const allProps = allProperties(props.concat(optProps));
    let first = !discriminator;
    let firstProp;
    for (const key of props) {
        if (first)
            first = false;
        else
            gen.add(names_1.default.json, (0, codegen_1.str) `,`);
        serializeProperty(key, properties[key], keyValue(key));
    }
    if (first)
        firstProp = gen.let("first", true);
    for (const key of optProps) {
        const value = keyValue(key);
        gen.if((0, codegen_1.and)((0, codegen_1._) `${value} !== undefined`, (0, code_1.isOwnProperty)(gen, data, key)), () => {
            addComma(cxt, firstProp);
            serializeProperty(key, optionalProperties[key], value);
        });
    }
    if (schema.additionalProperties) {
        gen.forIn("key", data, (key) => gen.if(isAdditional(key, allProps), () => serializeKeyValue(cxt, key, {}, firstProp)));
    }
    function keys(ps) {
        return ps ? Object.keys(ps) : [];
    }
    function allProperties(ps) {
        if (discriminator)
            ps.push(discriminator);
        if (new Set(ps).size !== ps.length) {
            throw new Error("JTD: properties/optionalProperties/disciminator overlap");
        }
        return ps;
    }
    function keyValue(key) {
        return gen.const("value", (0, codegen_1._) `${data}${(0, codegen_1.getProperty)(key)}`);
    }
    function serializeProperty(key, propSchema, value) {
        gen.add(names_1.default.json, (0, codegen_1.str) `${JSON.stringify(key)}:`);
        serializeCode({ ...cxt, schema: propSchema, data: value });
    }
    function isAdditional(key, ps) {
        return ps.length ? (0, codegen_1.and)(...ps.map((p) => (0, codegen_1._) `${key} !== ${p}`)) : true;
    }
}
function serializeType(cxt) {
    const { gen, schema, data } = cxt;
    switch (schema.type) {
        case "boolean":
            gen.add(names_1.default.json, (0, codegen_1._) `${data} ? "true" : "false"`);
            break;
        case "string":
            serializeString(cxt);
            break;
        case "timestamp":
            gen.if((0, codegen_1._) `${data} instanceof Date`, () => gen.add(names_1.default.json, (0, codegen_1._) `'"' + ${data}.toISOString() + '"'`), () => serializeString(cxt));
            break;
        default:
            serializeNumber(cxt);
    }
}
function serializeString({ gen, data }) {
    gen.add(names_1.default.json, (0, codegen_1._) `${(0, util_1.useFunc)(gen, quote_1.default)}(${data})`);
}
function serializeNumber({ gen, data, self }) {
    const condition = (0, codegen_1._) `${data} === Infinity || ${data} === -Infinity || ${data} !== ${data}`;
    if (self.opts.specialNumbers === undefined || self.opts.specialNumbers === "fast") {
        gen.add(names_1.default.json, (0, codegen_1._) `"" + ${data}`);
    }
    else {
        // specialNumbers === "null"
        gen.if(condition, () => gen.add(names_1.default.json, (0, codegen_1._) `null`), () => gen.add(names_1.default.json, (0, codegen_1._) `"" + ${data}`));
    }
}
function serializeRef(cxt) {
    const { gen, self, data, definitions, schema, schemaEnv } = cxt;
    const { ref } = schema;
    const refSchema = definitions[ref];
    if (!refSchema)
        throw new ref_error_1.default(self.opts.uriResolver, "", ref, `No definition ${ref}`);
    if (!(0, ref_1.hasRef)(refSchema))
        return serializeCode({ ...cxt, schema: refSchema });
    const { root } = schemaEnv;
    const sch = compileSerializer.call(self, new __1.SchemaEnv({ schema: refSchema, root }), definitions);
    gen.add(names_1.default.json, (0, codegen_1._) `${getSerialize(gen, sch)}(${data})`);
}
function getSerialize(gen, sch) {
    return sch.serialize
        ? gen.scopeValue("serialize", { ref: sch.serialize })
        : (0, codegen_1._) `${gen.scopeValue("wrapper", { ref: sch })}.serialize`;
}
function serializeEmpty({ gen, data }) {
    gen.add(names_1.default.json, (0, codegen_1._) `JSON.stringify(${data})`);
}
function addComma({ gen }, first) {
    if (first) {
        gen.if(first, () => gen.assign(first, false), () => gen.add(names_1.default.json, (0, codegen_1.str) `,`));
    }
    else {
        gen.add(names_1.default.json, (0, codegen_1.str) `,`);
    }
}
//# sourceMappingURL=serialize.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.jtdForms = void 0;
exports.jtdForms = [
    "elements",
    "values",
    "discriminator",
    "properties",
    "optionalProperties",
    "enum",
    "type",
    "ref",
];
//# sourceMappingURL=types.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("./codegen");
const names = {
    // validation function arguments
    data: new codegen_1.Name("data"), // data passed to validation function
    // args passed from referencing schema
    valCxt: new codegen_1.Name("valCxt"), // validation/data context - should not be used directly, it is destructured to the names below
    instancePath: new codegen_1.Name("instancePath"),
    parentData: new codegen_1.Name("parentData"),
    parentDataProperty: new codegen_1.Name("parentDataProperty"),
    rootData: new codegen_1.Name("rootData"), // root data - same as the data passed to the first/top validation function
    dynamicAnchors: new codegen_1.Name("dynamicAnchors"), // used to support recursiveRef and dynamicRef
    // function scoped variables
    vErrors: new codegen_1.Name("vErrors"), // null or array of validation errors
    errors: new codegen_1.Name("errors"), // counter of validation errors
    this: new codegen_1.Name("this"),
    // "globals"
    self: new codegen_1.Name("self"),
    scope: new codegen_1.Name("scope"),
    // JTD serialize/parse name for JSON string and position
    json: new codegen_1.Name("json"),
    jsonPos: new codegen_1.Name("jsonPos"),
    jsonLen: new codegen_1.Name("jsonLen"),
    jsonPart: new codegen_1.Name("jsonPart"),
};
exports.default = names;
//# sourceMappingURL=names.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const resolve_1 = require("./resolve");
class MissingRefError extends Error {
    constructor(resolver, baseId, ref, msg) {
        super(msg || `can't resolve reference ${ref} from id ${baseId}`);
        this.missingRef = (0, resolve_1.resolveUrl)(resolver, baseId, ref);
        this.missingSchema = (0, resolve_1.normalizeId)((0, resolve_1.getFullPath)(resolver, this.missingRef));
    }
}
exports.default = MissingRefError;
//# sourceMappingURL=ref_error.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0;
const util_1 = require("./util");
const equal = require("fast-deep-equal");
const traverse = require("json-schema-traverse");
// TODO refactor to use keyword definitions
const SIMPLE_INLINED = new Set([
    "type",
    "format",
    "pattern",
    "maxLength",
    "minLength",
    "maxProperties",
    "minProperties",
    "maxItems",
    "minItems",
    "maximum",
    "minimum",
    "uniqueItems",
    "multipleOf",
    "required",
    "enum",
    "const",
]);
function inlineRef(schema, limit = true) {
    if (typeof schema == "boolean")
        return true;
    if (limit === true)
        return !hasRef(schema);
    if (!limit)
        return false;
    return countKeys(schema) <= limit;
}
exports.inlineRef = inlineRef;
const REF_KEYWORDS = new Set([
    "$ref",
    "$recursiveRef",
    "$recursiveAnchor",
    "$dynamicRef",
    "$dynamicAnchor",
]);
function hasRef(schema) {
    for (const key in schema) {
        if (REF_KEYWORDS.has(key))
            return true;
        const sch = schema[key];
        if (Array.isArray(sch) && sch.some(hasRef))
            return true;
        if (typeof sch == "object" && hasRef(sch))
            return true;
    }
    return false;
}
function countKeys(schema) {
    let count = 0;
    for (const key in schema) {
        if (key === "$ref")
            return Infinity;
        count++;
        if (SIMPLE_INLINED.has(key))
            continue;
        if (typeof schema[key] == "object") {
            (0, util_1.eachItem)(schema[key], (sch) => (count += countKeys(sch)));
        }
        if (count === Infinity)
            return Infinity;
    }
    return count;
}
function getFullPath(resolver, id = "", normalize) {
    if (normalize !== false)
        id = normalizeId(id);
    const p = resolver.parse(id);
    return _getFullPath(resolver, p);
}
exports.getFullPath = getFullPath;
function _getFullPath(resolver, p) {
    const serialized = resolver.serialize(p);
    return serialized.split("#")[0] + "#";
}
exports._getFullPath = _getFullPath;
const TRAILING_SLASH_HASH = /#\/?$/;
function normalizeId(id) {
    return id ? id.replace(TRAILING_SLASH_HASH, "") : "";
}
exports.normalizeId = normalizeId;
function resolveUrl(resolver, baseId, id) {
    id = normalizeId(id);
    return resolver.resolve(baseId, id);
}
exports.resolveUrl = resolveUrl;
const ANCHOR = /^[a-z_][-a-z0-9._]*$/i;
function getSchemaRefs(schema, baseId) {
    if (typeof schema == "boolean")
        return {};
    const { schemaId, uriResolver } = this.opts;
    const schId = normalizeId(schema[schemaId] || baseId);
    const baseIds = { "": schId };
    const pathPrefix = getFullPath(uriResolver, schId, false);
    const localRefs = {};
    const schemaRefs = new Set();
    traverse(schema, { allKeys: true }, (sch, jsonPtr, _, parentJsonPtr) => {
        if (parentJsonPtr === undefined)
            return;
        const fullPath = pathPrefix + jsonPtr;
        let innerBaseId = baseIds[parentJsonPtr];
        if (typeof sch[schemaId] == "string")
            innerBaseId = addRef.call(this, sch[schemaId]);
        addAnchor.call(this, sch.$anchor);
        addAnchor.call(this, sch.$dynamicAnchor);
        baseIds[jsonPtr] = innerBaseId;
        function addRef(ref) {
            // eslint-disable-next-line @typescript-eslint/unbound-method
            const _resolve = this.opts.uriResolver.resolve;
            ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref);
            if (schemaRefs.has(ref))
                throw ambiguos(ref);
            schemaRefs.add(ref);
            let schOrRef = this.refs[ref];
            if (typeof schOrRef == "string")
                schOrRef = this.refs[schOrRef];
            if (typeof schOrRef == "object") {
                checkAmbiguosRef(sch, schOrRef.schema, ref);
            }
            else if (ref !== normalizeId(fullPath)) {
                if (ref[0] === "#") {
                    checkAmbiguosRef(sch, localRefs[ref], ref);
                    localRefs[ref] = sch;
                }
                else {
                    this.refs[ref] = fullPath;
                }
            }
            return ref;
        }
        function addAnchor(anchor) {
            if (typeof anchor == "string") {
                if (!ANCHOR.test(anchor))
                    throw new Error(`invalid anchor "${anchor}"`);
                addRef.call(this, `#${anchor}`);
            }
        }
    });
    return localRefs;
    function checkAmbiguosRef(sch1, sch2, ref) {
        if (sch2 !== undefined && !equal(sch1, sch2))
            throw ambiguos(ref);
    }
    function ambiguos(ref) {
        return new Error(`reference "${ref}" resolves to more than one schema`);
    }
}
exports.getSchemaRefs = getSchemaRefs;
//# sourceMappingURL=resolve.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRules = exports.isJSONType = void 0;
const _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"];
const jsonTypes = new Set(_jsonTypes);
function isJSONType(x) {
    return typeof x == "string" && jsonTypes.has(x);
}
exports.isJSONType = isJSONType;
function getRules() {
    const groups = {
        number: { type: "number", rules: [] },
        string: { type: "string", rules: [] },
        array: { type: "array", rules: [] },
        object: { type: "object", rules: [] },
    };
    return {
        types: { ...groups, integer: true, boolean: true, null: true },
        rules: [{ rules: [] }, groups.number, groups.string, groups.array, groups.object],
        post: { rules: [] },
        all: {},
        keywords: {},
    };
}
exports.getRules = getRules;
//# sourceMappingURL=rules.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0;
const codegen_1 = require("./codegen");
const code_1 = require("./codegen/code");
// TODO refactor to use Set
function toHash(arr) {
    const hash = {};
    for (const item of arr)
        hash[item] = true;
    return hash;
}
exports.toHash = toHash;
function alwaysValidSchema(it, schema) {
    if (typeof schema == "boolean")
        return schema;
    if (Object.keys(schema).length === 0)
        return true;
    checkUnknownRules(it, schema);
    return !schemaHasRules(schema, it.self.RULES.all);
}
exports.alwaysValidSchema = alwaysValidSchema;
function checkUnknownRules(it, schema = it.schema) {
    const { opts, self } = it;
    if (!opts.strictSchema)
        return;
    if (typeof schema === "boolean")
        return;
    const rules = self.RULES.keywords;
    for (const key in schema) {
        if (!rules[key])
            checkStrictMode(it, `unknown keyword: "${key}"`);
    }
}
exports.checkUnknownRules = checkUnknownRules;
function schemaHasRules(schema, rules) {
    if (typeof schema == "boolean")
        return !schema;
    for (const key in schema)
        if (rules[key])
            return true;
    return false;
}
exports.schemaHasRules = schemaHasRules;
function schemaHasRulesButRef(schema, RULES) {
    if (typeof schema == "boolean")
        return !schema;
    for (const key in schema)
        if (key !== "$ref" && RULES.all[key])
            return true;
    return false;
}
exports.schemaHasRulesButRef = schemaHasRulesButRef;
function schemaRefOrVal({ topSchemaRef, schemaPath }, schema, keyword, $data) {
    if (!$data) {
        if (typeof schema == "number" || typeof schema == "boolean")
            return schema;
        if (typeof schema == "string")
            return (0, codegen_1._) `${schema}`;
    }
    return (0, codegen_1._) `${topSchemaRef}${schemaPath}${(0, codegen_1.getProperty)(keyword)}`;
}
exports.schemaRefOrVal = schemaRefOrVal;
function unescapeFragment(str) {
    return unescapeJsonPointer(decodeURIComponent(str));
}
exports.unescapeFragment = unescapeFragment;
function escapeFragment(str) {
    return encodeURIComponent(escapeJsonPointer(str));
}
exports.escapeFragment = escapeFragment;
function escapeJsonPointer(str) {
    if (typeof str == "number")
        return `${str}`;
    return str.replace(/~/g, "~0").replace(/\//g, "~1");
}
exports.escapeJsonPointer = escapeJsonPointer;
function unescapeJsonPointer(str) {
    return str.replace(/~1/g, "/").replace(/~0/g, "~");
}
exports.unescapeJsonPointer = unescapeJsonPointer;
function eachItem(xs, f) {
    if (Array.isArray(xs)) {
        for (const x of xs)
            f(x);
    }
    else {
        f(xs);
    }
}
exports.eachItem = eachItem;
function makeMergeEvaluated({ mergeNames, mergeToName, mergeValues, resultToName, }) {
    return (gen, from, to, toName) => {
        const res = to === undefined
            ? from
            : to instanceof codegen_1.Name
                ? (from instanceof codegen_1.Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to)
                : from instanceof codegen_1.Name
                    ? (mergeToName(gen, to, from), from)
                    : mergeValues(from, to);
        return toName === codegen_1.Name && !(res instanceof codegen_1.Name) ? resultToName(gen, res) : res;
    };
}
exports.mergeEvaluated = {
    props: makeMergeEvaluated({
        mergeNames: (gen, from, to) => gen.if((0, codegen_1._) `${to} !== true && ${from} !== undefined`, () => {
            gen.if((0, codegen_1._) `${from} === true`, () => gen.assign(to, true), () => gen.assign(to, (0, codegen_1._) `${to} || {}`).code((0, codegen_1._) `Object.assign(${to}, ${from})`));
        }),
        mergeToName: (gen, from, to) => gen.if((0, codegen_1._) `${to} !== true`, () => {
            if (from === true) {
                gen.assign(to, true);
            }
            else {
                gen.assign(to, (0, codegen_1._) `${to} || {}`);
                setEvaluated(gen, to, from);
            }
        }),
        mergeValues: (from, to) => (from === true ? true : { ...from, ...to }),
        resultToName: evaluatedPropsToName,
    }),
    items: makeMergeEvaluated({
        mergeNames: (gen, from, to) => gen.if((0, codegen_1._) `${to} !== true && ${from} !== undefined`, () => gen.assign(to, (0, codegen_1._) `${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)),
        mergeToName: (gen, from, to) => gen.if((0, codegen_1._) `${to} !== true`, () => gen.assign(to, from === true ? true : (0, codegen_1._) `${to} > ${from} ? ${to} : ${from}`)),
        mergeValues: (from, to) => (from === true ? true : Math.max(from, to)),
        resultToName: (gen, items) => gen.var("items", items),
    }),
};
function evaluatedPropsToName(gen, ps) {
    if (ps === true)
        return gen.var("props", true);
    const props = gen.var("props", (0, codegen_1._) `{}`);
    if (ps !== undefined)
        setEvaluated(gen, props, ps);
    return props;
}
exports.evaluatedPropsToName = evaluatedPropsToName;
function setEvaluated(gen, props, ps) {
    Object.keys(ps).forEach((p) => gen.assign((0, codegen_1._) `${props}${(0, codegen_1.getProperty)(p)}`, true));
}
exports.setEvaluated = setEvaluated;
const snippets = {};
function useFunc(gen, f) {
    return gen.scopeValue("func", {
        ref: f,
        code: snippets[f.code] || (snippets[f.code] = new code_1._Code(f.code)),
    });
}
exports.useFunc = useFunc;
var Type;
(function (Type) {
    Type[Type["Num"] = 0] = "Num";
    Type[Type["Str"] = 1] = "Str";
})(Type || (exports.Type = Type = {}));
function getErrorPath(dataProp, dataPropType, jsPropertySyntax) {
    // let path
    if (dataProp instanceof codegen_1.Name) {
        const isNumber = dataPropType === Type.Num;
        return jsPropertySyntax
            ? isNumber
                ? (0, codegen_1._) `"[" + ${dataProp} + "]"`
                : (0, codegen_1._) `"['" + ${dataProp} + "']"`
            : isNumber
                ? (0, codegen_1._) `"/" + ${dataProp}`
                : (0, codegen_1._) `"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`; // TODO maybe use global escapePointer
    }
    return jsPropertySyntax ? (0, codegen_1.getProperty)(dataProp).toString() : "/" + escapeJsonPointer(dataProp);
}
exports.getErrorPath = getErrorPath;
function checkStrictMode(it, msg, mode = it.opts.strictSchema) {
    if (!mode)
        return;
    msg = `strict mode: ${msg}`;
    if (mode === true)
        throw new Error(msg);
    it.self.logger.warn(msg);
}
exports.checkStrictMode = checkStrictMode;
//# sourceMappingURL=util.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0;
function schemaHasRulesForType({ schema, self }, type) {
    const group = self.RULES.types[type];
    return group && group !== true && shouldUseGroup(schema, group);
}
exports.schemaHasRulesForType = schemaHasRulesForType;
function shouldUseGroup(schema, group) {
    return group.rules.some((rule) => shouldUseRule(schema, rule));
}
exports.shouldUseGroup = shouldUseGroup;
function shouldUseRule(schema, rule) {
    var _a;
    return (schema[rule.keyword] !== undefined ||
        ((_a = rule.definition.implements) === null || _a === void 0 ? void 0 : _a.some((kwd) => schema[kwd] !== undefined)));
}
exports.shouldUseRule = shouldUseRule;
//# sourceMappingURL=applicability.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0;
const errors_1 = require("../errors");
const codegen_1 = require("../codegen");
const names_1 = require("../names");
const boolError = {
    message: "boolean schema is false",
};
function topBoolOrEmptySchema(it) {
    const { gen, schema, validateName } = it;
    if (schema === false) {
        falseSchemaError(it, false);
    }
    else if (typeof schema == "object" && schema.$async === true) {
        gen.return(names_1.default.data);
    }
    else {
        gen.assign((0, codegen_1._) `${validateName}.errors`, null);
        gen.return(true);
    }
}
exports.topBoolOrEmptySchema = topBoolOrEmptySchema;
function boolOrEmptySchema(it, valid) {
    const { gen, schema } = it;
    if (schema === false) {
        gen.var(valid, false); // TODO var
        falseSchemaError(it);
    }
    else {
        gen.var(valid, true); // TODO var
    }
}
exports.boolOrEmptySchema = boolOrEmptySchema;
function falseSchemaError(it, overrideAllErrors) {
    const { gen, data } = it;
    // TODO maybe some other interface should be used for non-keyword validation errors...
    const cxt = {
        gen,
        keyword: "false schema",
        data,
        schema: false,
        schemaCode: false,
        schemaValue: false,
        params: {},
        it,
    };
    (0, errors_1.reportError)(cxt, boolError, undefined, overrideAllErrors);
}
//# sourceMappingURL=boolSchema.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0;
const rules_1 = require("../rules");
const applicability_1 = require("./applicability");
const errors_1 = require("../errors");
const codegen_1 = require("../codegen");
const util_1 = require("../util");
var DataType;
(function (DataType) {
    DataType[DataType["Correct"] = 0] = "Correct";
    DataType[DataType["Wrong"] = 1] = "Wrong";
})(DataType || (exports.DataType = DataType = {}));
function getSchemaTypes(schema) {
    const types = getJSONTypes(schema.type);
    const hasNull = types.includes("null");
    if (hasNull) {
        if (schema.nullable === false)
            throw new Error("type: null contradicts nullable: false");
    }
    else {
        if (!types.length && schema.nullable !== undefined) {
            throw new Error('"nullable" cannot be used without "type"');
        }
        if (schema.nullable === true)
            types.push("null");
    }
    return types;
}
exports.getSchemaTypes = getSchemaTypes;
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
function getJSONTypes(ts) {
    const types = Array.isArray(ts) ? ts : ts ? [ts] : [];
    if (types.every(rules_1.isJSONType))
        return types;
    throw new Error("type must be JSONType or JSONType[]: " + types.join(","));
}
exports.getJSONTypes = getJSONTypes;
function coerceAndCheckDataType(it, types) {
    const { gen, data, opts } = it;
    const coerceTo = coerceToTypes(types, opts.coerceTypes);
    const checkTypes = types.length > 0 &&
        !(coerceTo.length === 0 && types.length === 1 && (0, applicability_1.schemaHasRulesForType)(it, types[0]));
    if (checkTypes) {
        const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong);
        gen.if(wrongType, () => {
            if (coerceTo.length)
                coerceData(it, types, coerceTo);
            else
                reportTypeError(it);
        });
    }
    return checkTypes;
}
exports.coerceAndCheckDataType = coerceAndCheckDataType;
const COERCIBLE = new Set(["string", "number", "integer", "boolean", "null"]);
function coerceToTypes(types, coerceTypes) {
    return coerceTypes
        ? types.filter((t) => COERCIBLE.has(t) || (coerceTypes === "array" && t === "array"))
        : [];
}
function coerceData(it, types, coerceTo) {
    const { gen, data, opts } = it;
    const dataType = gen.let("dataType", (0, codegen_1._) `typeof ${data}`);
    const coerced = gen.let("coerced", (0, codegen_1._) `undefined`);
    if (opts.coerceTypes === "array") {
        gen.if((0, codegen_1._) `${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () => gen
            .assign(data, (0, codegen_1._) `${data}[0]`)
            .assign(dataType, (0, codegen_1._) `typeof ${data}`)
            .if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data)));
    }
    gen.if((0, codegen_1._) `${coerced} !== undefined`);
    for (const t of coerceTo) {
        if (COERCIBLE.has(t) || (t === "array" && opts.coerceTypes === "array")) {
            coerceSpecificType(t);
        }
    }
    gen.else();
    reportTypeError(it);
    gen.endIf();
    gen.if((0, codegen_1._) `${coerced} !== undefined`, () => {
        gen.assign(data, coerced);
        assignParentData(it, coerced);
    });
    function coerceSpecificType(t) {
        switch (t) {
            case "string":
                gen
                    .elseIf((0, codegen_1._) `${dataType} == "number" || ${dataType} == "boolean"`)
                    .assign(coerced, (0, codegen_1._) `"" + ${data}`)
                    .elseIf((0, codegen_1._) `${data} === null`)
                    .assign(coerced, (0, codegen_1._) `""`);
                return;
            case "number":
                gen
                    .elseIf((0, codegen_1._) `${dataType} == "boolean" || ${data} === null
              || (${dataType} == "string" && ${data} && ${data} == +${data})`)
                    .assign(coerced, (0, codegen_1._) `+${data}`);
                return;
            case "integer":
                gen
                    .elseIf((0, codegen_1._) `${dataType} === "boolean" || ${data} === null
              || (${dataType} === "string" && ${data} && ${data} == +${data} && !(${data} % 1))`)
                    .assign(coerced, (0, codegen_1._) `+${data}`);
                return;
            case "boolean":
                gen
                    .elseIf((0, codegen_1._) `${data} === "false" || ${data} === 0 || ${data} === null`)
                    .assign(coerced, false)
                    .elseIf((0, codegen_1._) `${data} === "true" || ${data} === 1`)
                    .assign(coerced, true);
                return;
            case "null":
                gen.elseIf((0, codegen_1._) `${data} === "" || ${data} === 0 || ${data} === false`);
                gen.assign(coerced, null);
                return;
            case "array":
                gen
                    .elseIf((0, codegen_1._) `${dataType} === "string" || ${dataType} === "number"
              || ${dataType} === "boolean" || ${data} === null`)
                    .assign(coerced, (0, codegen_1._) `[${data}]`);
        }
    }
}
function assignParentData({ gen, parentData, parentDataProperty }, expr) {
    // TODO use gen.property
    gen.if((0, codegen_1._) `${parentData} !== undefined`, () => gen.assign((0, codegen_1._) `${parentData}[${parentDataProperty}]`, expr));
}
function checkDataType(dataType, data, strictNums, correct = DataType.Correct) {
    const EQ = correct === DataType.Correct ? codegen_1.operators.EQ : codegen_1.operators.NEQ;
    let cond;
    switch (dataType) {
        case "null":
            return (0, codegen_1._) `${data} ${EQ} null`;
        case "array":
            cond = (0, codegen_1._) `Array.isArray(${data})`;
            break;
        case "object":
            cond = (0, codegen_1._) `${data} && typeof ${data} == "object" && !Array.isArray(${data})`;
            break;
        case "integer":
            cond = numCond((0, codegen_1._) `!(${data} % 1) && !isNaN(${data})`);
            break;
        case "number":
            cond = numCond();
            break;
        default:
            return (0, codegen_1._) `typeof ${data} ${EQ} ${dataType}`;
    }
    return correct === DataType.Correct ? cond : (0, codegen_1.not)(cond);
    function numCond(_cond = codegen_1.nil) {
        return (0, codegen_1.and)((0, codegen_1._) `typeof ${data} == "number"`, _cond, strictNums ? (0, codegen_1._) `isFinite(${data})` : codegen_1.nil);
    }
}
exports.checkDataType = checkDataType;
function checkDataTypes(dataTypes, data, strictNums, correct) {
    if (dataTypes.length === 1) {
        return checkDataType(dataTypes[0], data, strictNums, correct);
    }
    let cond;
    const types = (0, util_1.toHash)(dataTypes);
    if (types.array && types.object) {
        const notObj = (0, codegen_1._) `typeof ${data} != "object"`;
        cond = types.null ? notObj : (0, codegen_1._) `!${data} || ${notObj}`;
        delete types.null;
        delete types.array;
        delete types.object;
    }
    else {
        cond = codegen_1.nil;
    }
    if (types.number)
        delete types.integer;
    for (const t in types)
        cond = (0, codegen_1.and)(cond, checkDataType(t, data, strictNums, correct));
    return cond;
}
exports.checkDataTypes = checkDataTypes;
const typeError = {
    message: ({ schema }) => `must be ${schema}`,
    params: ({ schema, schemaValue }) => typeof schema == "string" ? (0, codegen_1._) `{type: ${schema}}` : (0, codegen_1._) `{type: ${schemaValue}}`,
};
function reportTypeError(it) {
    const cxt = getTypeErrorContext(it);
    (0, errors_1.reportError)(cxt, typeError);
}
exports.reportTypeError = reportTypeError;
function getTypeErrorContext(it) {
    const { gen, data, schema } = it;
    const schemaCode = (0, util_1.schemaRefOrVal)(it, schema, "type");
    return {
        gen,
        keyword: "type",
        data,
        schema: schema.type,
        schemaCode,
        schemaValue: schemaCode,
        parentSchema: schema,
        params: {},
        it,
    };
}
//# sourceMappingURL=dataType.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.assignDefaults = void 0;
const codegen_1 = require("../codegen");
const util_1 = require("../util");
function assignDefaults(it, ty) {
    const { properties, items } = it.schema;
    if (ty === "object" && properties) {
        for (const key in properties) {
            assignDefault(it, key, properties[key].default);
        }
    }
    else if (ty === "array" && Array.isArray(items)) {
        items.forEach((sch, i) => assignDefault(it, i, sch.default));
    }
}
exports.assignDefaults = assignDefaults;
function assignDefault(it, prop, defaultValue) {
    const { gen, compositeRule, data, opts } = it;
    if (defaultValue === undefined)
        return;
    const childData = (0, codegen_1._) `${data}${(0, codegen_1.getProperty)(prop)}`;
    if (compositeRule) {
        (0, util_1.checkStrictMode)(it, `default is ignored for: ${childData}`);
        return;
    }
    let condition = (0, codegen_1._) `${childData} === undefined`;
    if (opts.useDefaults === "empty") {
        condition = (0, codegen_1._) `${condition} || ${childData} === null || ${childData} === ""`;
    }
    // `${childData} === undefined` +
    // (opts.useDefaults === "empty" ? ` || ${childData} === null || ${childData} === ""` : "")
    gen.if(condition, (0, codegen_1._) `${childData} = ${(0, codegen_1.stringify)(defaultValue)}`);
}
//# sourceMappingURL=defaults.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0;
const boolSchema_1 = require("./boolSchema");
const dataType_1 = require("./dataType");
const applicability_1 = require("./applicability");
const dataType_2 = require("./dataType");
const defaults_1 = require("./defaults");
const keyword_1 = require("./keyword");
const subschema_1 = require("./subschema");
const codegen_1 = require("../codegen");
const names_1 = require("../names");
const resolve_1 = require("../resolve");
const util_1 = require("../util");
const errors_1 = require("../errors");
// schema compilation - generates validation function, subschemaCode (below) is used for subschemas
function validateFunctionCode(it) {
    if (isSchemaObj(it)) {
        checkKeywords(it);
        if (schemaCxtHasRules(it)) {
            topSchemaObjCode(it);
            return;
        }
    }
    validateFunction(it, () => (0, boolSchema_1.topBoolOrEmptySchema)(it));
}
exports.validateFunctionCode = validateFunctionCode;
function validateFunction({ gen, validateName, schema, schemaEnv, opts }, body) {
    if (opts.code.es5) {
        gen.func(validateName, (0, codegen_1._) `${names_1.default.data}, ${names_1.default.valCxt}`, schemaEnv.$async, () => {
            gen.code((0, codegen_1._) `"use strict"; ${funcSourceUrl(schema, opts)}`);
            destructureValCxtES5(gen, opts);
            gen.code(body);
        });
    }
    else {
        gen.func(validateName, (0, codegen_1._) `${names_1.default.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () => gen.code(funcSourceUrl(schema, opts)).code(body));
    }
}
function destructureValCxt(opts) {
    return (0, codegen_1._) `{${names_1.default.instancePath}="", ${names_1.default.parentData}, ${names_1.default.parentDataProperty}, ${names_1.default.rootData}=${names_1.default.data}${opts.dynamicRef ? (0, codegen_1._) `, ${names_1.default.dynamicAnchors}={}` : codegen_1.nil}}={}`;
}
function destructureValCxtES5(gen, opts) {
    gen.if(names_1.default.valCxt, () => {
        gen.var(names_1.default.instancePath, (0, codegen_1._) `${names_1.default.valCxt}.${names_1.default.instancePath}`);
        gen.var(names_1.default.parentData, (0, codegen_1._) `${names_1.default.valCxt}.${names_1.default.parentData}`);
        gen.var(names_1.default.parentDataProperty, (0, codegen_1._) `${names_1.default.valCxt}.${names_1.default.parentDataProperty}`);
        gen.var(names_1.default.rootData, (0, codegen_1._) `${names_1.default.valCxt}.${names_1.default.rootData}`);
        if (opts.dynamicRef)
            gen.var(names_1.default.dynamicAnchors, (0, codegen_1._) `${names_1.default.valCxt}.${names_1.default.dynamicAnchors}`);
    }, () => {
        gen.var(names_1.default.instancePath, (0, codegen_1._) `""`);
        gen.var(names_1.default.parentData, (0, codegen_1._) `undefined`);
        gen.var(names_1.default.parentDataProperty, (0, codegen_1._) `undefined`);
        gen.var(names_1.default.rootData, names_1.default.data);
        if (opts.dynamicRef)
            gen.var(names_1.default.dynamicAnchors, (0, codegen_1._) `{}`);
    });
}
function topSchemaObjCode(it) {
    const { schema, opts, gen } = it;
    validateFunction(it, () => {
        if (opts.$comment && schema.$comment)
            commentKeyword(it);
        checkNoDefault(it);
        gen.let(names_1.default.vErrors, null);
        gen.let(names_1.default.errors, 0);
        if (opts.unevaluated)
            resetEvaluated(it);
        typeAndKeywords(it);
        returnResults(it);
    });
    return;
}
function resetEvaluated(it) {
    // TODO maybe some hook to execute it in the end to check whether props/items are Name, as in assignEvaluated
    const { gen, validateName } = it;
    it.evaluated = gen.const("evaluated", (0, codegen_1._) `${validateName}.evaluated`);
    gen.if((0, codegen_1._) `${it.evaluated}.dynamicProps`, () => gen.assign((0, codegen_1._) `${it.evaluated}.props`, (0, codegen_1._) `undefined`));
    gen.if((0, codegen_1._) `${it.evaluated}.dynamicItems`, () => gen.assign((0, codegen_1._) `${it.evaluated}.items`, (0, codegen_1._) `undefined`));
}
function funcSourceUrl(schema, opts) {
    const schId = typeof schema == "object" && schema[opts.schemaId];
    return schId && (opts.code.source || opts.code.process) ? (0, codegen_1._) `/*# sourceURL=${schId} */` : codegen_1.nil;
}
// schema compilation - this function is used recursively to generate code for sub-schemas
function subschemaCode(it, valid) {
    if (isSchemaObj(it)) {
        checkKeywords(it);
        if (schemaCxtHasRules(it)) {
            subSchemaObjCode(it, valid);
            return;
        }
    }
    (0, boolSchema_1.boolOrEmptySchema)(it, valid);
}
function schemaCxtHasRules({ schema, self }) {
    if (typeof schema == "boolean")
        return !schema;
    for (const key in schema)
        if (self.RULES.all[key])
            return true;
    return false;
}
function isSchemaObj(it) {
    return typeof it.schema != "boolean";
}
function subSchemaObjCode(it, valid) {
    const { schema, gen, opts } = it;
    if (opts.$comment && schema.$comment)
        commentKeyword(it);
    updateContext(it);
    checkAsyncSchema(it);
    const errsCount = gen.const("_errs", names_1.default.errors);
    typeAndKeywords(it, errsCount);
    // TODO var
    gen.var(valid, (0, codegen_1._) `${errsCount} === ${names_1.default.errors}`);
}
function checkKeywords(it) {
    (0, util_1.checkUnknownRules)(it);
    checkRefsAndKeywords(it);
}
function typeAndKeywords(it, errsCount) {
    if (it.opts.jtd)
        return schemaKeywords(it, [], false, errsCount);
    const types = (0, dataType_1.getSchemaTypes)(it.schema);
    const checkedTypes = (0, dataType_1.coerceAndCheckDataType)(it, types);
    schemaKeywords(it, types, !checkedTypes, errsCount);
}
function checkRefsAndKeywords(it) {
    const { schema, errSchemaPath, opts, self } = it;
    if (schema.$ref && opts.ignoreKeywordsWithRef && (0, util_1.schemaHasRulesButRef)(schema, self.RULES)) {
        self.logger.warn(`$ref: keywords ignored in schema at path "${errSchemaPath}"`);
    }
}
function checkNoDefault(it) {
    const { schema, opts } = it;
    if (schema.default !== undefined && opts.useDefaults && opts.strictSchema) {
        (0, util_1.checkStrictMode)(it, "default is ignored in the schema root");
    }
}
function updateContext(it) {
    const schId = it.schema[it.opts.schemaId];
    if (schId)
        it.baseId = (0, resolve_1.resolveUrl)(it.opts.uriResolver, it.baseId, schId);
}
function checkAsyncSchema(it) {
    if (it.schema.$async && !it.schemaEnv.$async)
        throw new Error("async schema in sync schema");
}
function commentKeyword({ gen, schemaEnv, schema, errSchemaPath, opts }) {
    const msg = schema.$comment;
    if (opts.$comment === true) {
        gen.code((0, codegen_1._) `${names_1.default.self}.logger.log(${msg})`);
    }
    else if (typeof opts.$comment == "function") {
        const schemaPath = (0, codegen_1.str) `${errSchemaPath}/$comment`;
        const rootName = gen.scopeValue("root", { ref: schemaEnv.root });
        gen.code((0, codegen_1._) `${names_1.default.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`);
    }
}
function returnResults(it) {
    const { gen, schemaEnv, validateName, ValidationError, opts } = it;
    if (schemaEnv.$async) {
        // TODO assign unevaluated
        gen.if((0, codegen_1._) `${names_1.default.errors} === 0`, () => gen.return(names_1.default.data), () => gen.throw((0, codegen_1._) `new ${ValidationError}(${names_1.default.vErrors})`));
    }
    else {
        gen.assign((0, codegen_1._) `${validateName}.errors`, names_1.default.vErrors);
        if (opts.unevaluated)
            assignEvaluated(it);
        gen.return((0, codegen_1._) `${names_1.default.errors} === 0`);
    }
}
function assignEvaluated({ gen, evaluated, props, items }) {
    if (props instanceof codegen_1.Name)
        gen.assign((0, codegen_1._) `${evaluated}.props`, props);
    if (items instanceof codegen_1.Name)
        gen.assign((0, codegen_1._) `${evaluated}.items`, items);
}
function schemaKeywords(it, types, typeErrors, errsCount) {
    const { gen, schema, data, allErrors, opts, self } = it;
    const { RULES } = self;
    if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) {
        gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition)); // TODO typecast
        return;
    }
    if (!opts.jtd)
        checkStrictTypes(it, types);
    gen.block(() => {
        for (const group of RULES.rules)
            groupKeywords(group);
        groupKeywords(RULES.post);
    });
    function groupKeywords(group) {
        if (!(0, applicability_1.shouldUseGroup)(schema, group))
            return;
        if (group.type) {
            gen.if((0, dataType_2.checkDataType)(group.type, data, opts.strictNumbers));
            iterateKeywords(it, group);
            if (types.length === 1 && types[0] === group.type && typeErrors) {
                gen.else();
                (0, dataType_2.reportTypeError)(it);
            }
            gen.endIf();
        }
        else {
            iterateKeywords(it, group);
        }
        // TODO make it "ok" call?
        if (!allErrors)
            gen.if((0, codegen_1._) `${names_1.default.errors} === ${errsCount || 0}`);
    }
}
function iterateKeywords(it, group) {
    const { gen, schema, opts: { useDefaults }, } = it;
    if (useDefaults)
        (0, defaults_1.assignDefaults)(it, group.type);
    gen.block(() => {
        for (const rule of group.rules) {
            if ((0, applicability_1.shouldUseRule)(schema, rule)) {
                keywordCode(it, rule.keyword, rule.definition, group.type);
            }
        }
    });
}
function checkStrictTypes(it, types) {
    if (it.schemaEnv.meta || !it.opts.strictTypes)
        return;
    checkContextTypes(it, types);
    if (!it.opts.allowUnionTypes)
        checkMultipleTypes(it, types);
    checkKeywordTypes(it, it.dataTypes);
}
function checkContextTypes(it, types) {
    if (!types.length)
        return;
    if (!it.dataTypes.length) {
        it.dataTypes = types;
        return;
    }
    types.forEach((t) => {
        if (!includesType(it.dataTypes, t)) {
            strictTypesError(it, `type "${t}" not allowed by context "${it.dataTypes.join(",")}"`);
        }
    });
    narrowSchemaTypes(it, types);
}
function checkMultipleTypes(it, ts) {
    if (ts.length > 1 && !(ts.length === 2 && ts.includes("null"))) {
        strictTypesError(it, "use allowUnionTypes to allow union type keyword");
    }
}
function checkKeywordTypes(it, ts) {
    const rules = it.self.RULES.all;
    for (const keyword in rules) {
        const rule = rules[keyword];
        if (typeof rule == "object" && (0, applicability_1.shouldUseRule)(it.schema, rule)) {
            const { type } = rule.definition;
            if (type.length && !type.some((t) => hasApplicableType(ts, t))) {
                strictTypesError(it, `missing type "${type.join(",")}" for keyword "${keyword}"`);
            }
        }
    }
}
function hasApplicableType(schTs, kwdT) {
    return schTs.includes(kwdT) || (kwdT === "number" && schTs.includes("integer"));
}
function includesType(ts, t) {
    return ts.includes(t) || (t === "integer" && ts.includes("number"));
}
function narrowSchemaTypes(it, withTypes) {
    const ts = [];
    for (const t of it.dataTypes) {
        if (includesType(withTypes, t))
            ts.push(t);
        else if (withTypes.includes("integer") && t === "number")
            ts.push("integer");
    }
    it.dataTypes = ts;
}
function strictTypesError(it, msg) {
    const schemaPath = it.schemaEnv.baseId + it.errSchemaPath;
    msg += ` at "${schemaPath}" (strictTypes)`;
    (0, util_1.checkStrictMode)(it, msg, it.opts.strictTypes);
}
class KeywordCxt {
    constructor(it, def, keyword) {
        (0, keyword_1.validateKeywordUsage)(it, def, keyword);
        this.gen = it.gen;
        this.allErrors = it.allErrors;
        this.keyword = keyword;
        this.data = it.data;
        this.schema = it.schema[keyword];
        this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data;
        this.schemaValue = (0, util_1.schemaRefOrVal)(it, this.schema, keyword, this.$data);
        this.schemaType = def.schemaType;
        this.parentSchema = it.schema;
        this.params = {};
        this.it = it;
        this.def = def;
        if (this.$data) {
            this.schemaCode = it.gen.const("vSchema", getData(this.$data, it));
        }
        else {
            this.schemaCode = this.schemaValue;
            if (!(0, keyword_1.validSchemaType)(this.schema, def.schemaType, def.allowUndefined)) {
                throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`);
            }
        }
        if ("code" in def ? def.trackErrors : def.errors !== false) {
            this.errsCount = it.gen.const("_errs", names_1.default.errors);
        }
    }
    result(condition, successAction, failAction) {
        this.failResult((0, codegen_1.not)(condition), successAction, failAction);
    }
    failResult(condition, successAction, failAction) {
        this.gen.if(condition);
        if (failAction)
            failAction();
        else
            this.error();
        if (successAction) {
            this.gen.else();
            successAction();
            if (this.allErrors)
                this.gen.endIf();
        }
        else {
            if (this.allErrors)
                this.gen.endIf();
            else
                this.gen.else();
        }
    }
    pass(condition, failAction) {
        this.failResult((0, codegen_1.not)(condition), undefined, failAction);
    }
    fail(condition) {
        if (condition === undefined) {
            this.error();
            if (!this.allErrors)
                this.gen.if(false); // this branch will be removed by gen.optimize
            return;
        }
        this.gen.if(condition);
        this.error();
        if (this.allErrors)
            this.gen.endIf();
        else
            this.gen.else();
    }
    fail$data(condition) {
        if (!this.$data)
            return this.fail(condition);
        const { schemaCode } = this;
        this.fail((0, codegen_1._) `${schemaCode} !== undefined && (${(0, codegen_1.or)(this.invalid$data(), condition)})`);
    }
    error(append, errorParams, errorPaths) {
        if (errorParams) {
            this.setParams(errorParams);
            this._error(append, errorPaths);
            this.setParams({});
            return;
        }
        this._error(append, errorPaths);
    }
    _error(append, errorPaths) {
        ;
        (append ? errors_1.reportExtraError : errors_1.reportError)(this, this.def.error, errorPaths);
    }
    $dataError() {
        (0, errors_1.reportError)(this, this.def.$dataError || errors_1.keyword$DataError);
    }
    reset() {
        if (this.errsCount === undefined)
            throw new Error('add "trackErrors" to keyword definition');
        (0, errors_1.resetErrorsCount)(this.gen, this.errsCount);
    }
    ok(cond) {
        if (!this.allErrors)
            this.gen.if(cond);
    }
    setParams(obj, assign) {
        if (assign)
            Object.assign(this.params, obj);
        else
            this.params = obj;
    }
    block$data(valid, codeBlock, $dataValid = codegen_1.nil) {
        this.gen.block(() => {
            this.check$data(valid, $dataValid);
            codeBlock();
        });
    }
    check$data(valid = codegen_1.nil, $dataValid = codegen_1.nil) {
        if (!this.$data)
            return;
        const { gen, schemaCode, schemaType, def } = this;
        gen.if((0, codegen_1.or)((0, codegen_1._) `${schemaCode} === undefined`, $dataValid));
        if (valid !== codegen_1.nil)
            gen.assign(valid, true);
        if (schemaType.length || def.validateSchema) {
            gen.elseIf(this.invalid$data());
            this.$dataError();
            if (valid !== codegen_1.nil)
                gen.assign(valid, false);
        }
        gen.else();
    }
    invalid$data() {
        const { gen, schemaCode, schemaType, def, it } = this;
        return (0, codegen_1.or)(wrong$DataType(), invalid$DataSchema());
        function wrong$DataType() {
            if (schemaType.length) {
                /* istanbul ignore if */
                if (!(schemaCode instanceof codegen_1.Name))
                    throw new Error("ajv implementation error");
                const st = Array.isArray(schemaType) ? schemaType : [schemaType];
                return (0, codegen_1._) `${(0, dataType_2.checkDataTypes)(st, schemaCode, it.opts.strictNumbers, dataType_2.DataType.Wrong)}`;
            }
            return codegen_1.nil;
        }
        function invalid$DataSchema() {
            if (def.validateSchema) {
                const validateSchemaRef = gen.scopeValue("validate$data", { ref: def.validateSchema }); // TODO value.code for standalone
                return (0, codegen_1._) `!${validateSchemaRef}(${schemaCode})`;
            }
            return codegen_1.nil;
        }
    }
    subschema(appl, valid) {
        const subschema = (0, subschema_1.getSubschema)(this.it, appl);
        (0, subschema_1.extendSubschemaData)(subschema, this.it, appl);
        (0, subschema_1.extendSubschemaMode)(subschema, appl);
        const nextContext = { ...this.it, ...subschema, items: undefined, props: undefined };
        subschemaCode(nextContext, valid);
        return nextContext;
    }
    mergeEvaluated(schemaCxt, toName) {
        const { it, gen } = this;
        if (!it.opts.unevaluated)
            return;
        if (it.props !== true && schemaCxt.props !== undefined) {
            it.props = util_1.mergeEvaluated.props(gen, schemaCxt.props, it.props, toName);
        }
        if (it.items !== true && schemaCxt.items !== undefined) {
            it.items = util_1.mergeEvaluated.items(gen, schemaCxt.items, it.items, toName);
        }
    }
    mergeValidEvaluated(schemaCxt, valid) {
        const { it, gen } = this;
        if (it.opts.unevaluated && (it.props !== true || it.items !== true)) {
            gen.if(valid, () => this.mergeEvaluated(schemaCxt, codegen_1.Name));
            return true;
        }
    }
}
exports.KeywordCxt = KeywordCxt;
function keywordCode(it, keyword, def, ruleType) {
    const cxt = new KeywordCxt(it, def, keyword);
    if ("code" in def) {
        def.code(cxt, ruleType);
    }
    else if (cxt.$data && def.validate) {
        (0, keyword_1.funcKeywordCode)(cxt, def);
    }
    else if ("macro" in def) {
        (0, keyword_1.macroKeywordCode)(cxt, def);
    }
    else if (def.compile || def.validate) {
        (0, keyword_1.funcKeywordCode)(cxt, def);
    }
}
const JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/;
const RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
function getData($data, { dataLevel, dataNames, dataPathArr }) {
    let jsonPointer;
    let data;
    if ($data === "")
        return names_1.default.rootData;
    if ($data[0] === "/") {
        if (!JSON_POINTER.test($data))
            throw new Error(`Invalid JSON-pointer: ${$data}`);
        jsonPointer = $data;
        data = names_1.default.rootData;
    }
    else {
        const matches = RELATIVE_JSON_POINTER.exec($data);
        if (!matches)
            throw new Error(`Invalid JSON-pointer: ${$data}`);
        const up = +matches[1];
        jsonPointer = matches[2];
        if (jsonPointer === "#") {
            if (up >= dataLevel)
                throw new Error(errorMsg("property/index", up));
            return dataPathArr[dataLevel - up];
        }
        if (up > dataLevel)
            throw new Error(errorMsg("data", up));
        data = dataNames[dataLevel - up];
        if (!jsonPointer)
            return data;
    }
    let expr = data;
    const segments = jsonPointer.split("/");
    for (const segment of segments) {
        if (segment) {
            data = (0, codegen_1._) `${data}${(0, codegen_1.getProperty)((0, util_1.unescapeJsonPointer)(segment))}`;
            expr = (0, codegen_1._) `${expr} && ${data}`;
        }
    }
    return expr;
    function errorMsg(pointerType, up) {
        return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`;
    }
}
exports.getData = getData;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0;
const codegen_1 = require("../codegen");
const names_1 = require("../names");
const code_1 = require("../../vocabularies/code");
const errors_1 = require("../errors");
function macroKeywordCode(cxt, def) {
    const { gen, keyword, schema, parentSchema, it } = cxt;
    const macroSchema = def.macro.call(it.self, schema, parentSchema, it);
    const schemaRef = useKeyword(gen, keyword, macroSchema);
    if (it.opts.validateSchema !== false)
        it.self.validateSchema(macroSchema, true);
    const valid = gen.name("valid");
    cxt.subschema({
        schema: macroSchema,
        schemaPath: codegen_1.nil,
        errSchemaPath: `${it.errSchemaPath}/${keyword}`,
        topSchemaRef: schemaRef,
        compositeRule: true,
    }, valid);
    cxt.pass(valid, () => cxt.error(true));
}
exports.macroKeywordCode = macroKeywordCode;
function funcKeywordCode(cxt, def) {
    var _a;
    const { gen, keyword, schema, parentSchema, $data, it } = cxt;
    checkAsyncKeyword(it, def);
    const validate = !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate;
    const validateRef = useKeyword(gen, keyword, validate);
    const valid = gen.let("valid");
    cxt.block$data(valid, validateKeyword);
    cxt.ok((_a = def.valid) !== null && _a !== void 0 ? _a : valid);
    function validateKeyword() {
        if (def.errors === false) {
            assignValid();
            if (def.modifying)
                modifyData(cxt);
            reportErrs(() => cxt.error());
        }
        else {
            const ruleErrs = def.async ? validateAsync() : validateSync();
            if (def.modifying)
                modifyData(cxt);
            reportErrs(() => addErrs(cxt, ruleErrs));
        }
    }
    function validateAsync() {
        const ruleErrs = gen.let("ruleErrs", null);
        gen.try(() => assignValid((0, codegen_1._) `await `), (e) => gen.assign(valid, false).if((0, codegen_1._) `${e} instanceof ${it.ValidationError}`, () => gen.assign(ruleErrs, (0, codegen_1._) `${e}.errors`), () => gen.throw(e)));
        return ruleErrs;
    }
    function validateSync() {
        const validateErrs = (0, codegen_1._) `${validateRef}.errors`;
        gen.assign(validateErrs, null);
        assignValid(codegen_1.nil);
        return validateErrs;
    }
    function assignValid(_await = def.async ? (0, codegen_1._) `await ` : codegen_1.nil) {
        const passCxt = it.opts.passContext ? names_1.default.this : names_1.default.self;
        const passSchema = !(("compile" in def && !$data) || def.schema === false);
        gen.assign(valid, (0, codegen_1._) `${_await}${(0, code_1.callValidateCode)(cxt, validateRef, passCxt, passSchema)}`, def.modifying);
    }
    function reportErrs(errors) {
        var _a;
        gen.if((0, codegen_1.not)((_a = def.valid) !== null && _a !== void 0 ? _a : valid), errors);
    }
}
exports.funcKeywordCode = funcKeywordCode;
function modifyData(cxt) {
    const { gen, data, it } = cxt;
    gen.if(it.parentData, () => gen.assign(data, (0, codegen_1._) `${it.parentData}[${it.parentDataProperty}]`));
}
function addErrs(cxt, errs) {
    const { gen } = cxt;
    gen.if((0, codegen_1._) `Array.isArray(${errs})`, () => {
        gen
            .assign(names_1.default.vErrors, (0, codegen_1._) `${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`)
            .assign(names_1.default.errors, (0, codegen_1._) `${names_1.default.vErrors}.length`);
        (0, errors_1.extendErrors)(cxt);
    }, () => cxt.error());
}
function checkAsyncKeyword({ schemaEnv }, def) {
    if (def.async && !schemaEnv.$async)
        throw new Error("async keyword in sync schema");
}
function useKeyword(gen, keyword, result) {
    if (result === undefined)
        throw new Error(`keyword "${keyword}" failed to compile`);
    return gen.scopeValue("keyword", typeof result == "function" ? { ref: result } : { ref: result, code: (0, codegen_1.stringify)(result) });
}
function validSchemaType(schema, schemaType, allowUndefined = false) {
    // TODO add tests
    return (!schemaType.length ||
        schemaType.some((st) => st === "array"
            ? Array.isArray(schema)
            : st === "object"
                ? schema && typeof schema == "object" && !Array.isArray(schema)
                : typeof schema == st || (allowUndefined && typeof schema == "undefined")));
}
exports.validSchemaType = validSchemaType;
function validateKeywordUsage({ schema, opts, self, errSchemaPath }, def, keyword) {
    /* istanbul ignore if */
    if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) {
        throw new Error("ajv implementation error");
    }
    const deps = def.dependencies;
    if (deps === null || deps === void 0 ? void 0 : deps.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) {
        throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(",")}`);
    }
    if (def.validateSchema) {
        const valid = def.validateSchema(schema[keyword]);
        if (!valid) {
            const msg = `keyword "${keyword}" value is invalid at path "${errSchemaPath}": ` +
                self.errorsText(def.validateSchema.errors);
            if (opts.validateSchema === "log")
                self.logger.error(msg);
            else
                throw new Error(msg);
        }
    }
}
exports.validateKeywordUsage = validateKeywordUsage;
//# sourceMappingURL=keyword.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0;
const codegen_1 = require("../codegen");
const util_1 = require("../util");
function getSubschema(it, { keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef }) {
    if (keyword !== undefined && schema !== undefined) {
        throw new Error('both "keyword" and "schema" passed, only one allowed');
    }
    if (keyword !== undefined) {
        const sch = it.schema[keyword];
        return schemaProp === undefined
            ? {
                schema: sch,
                schemaPath: (0, codegen_1._) `${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}`,
                errSchemaPath: `${it.errSchemaPath}/${keyword}`,
            }
            : {
                schema: sch[schemaProp],
                schemaPath: (0, codegen_1._) `${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}${(0, codegen_1.getProperty)(schemaProp)}`,
                errSchemaPath: `${it.errSchemaPath}/${keyword}/${(0, util_1.escapeFragment)(schemaProp)}`,
            };
    }
    if (schema !== undefined) {
        if (schemaPath === undefined || errSchemaPath === undefined || topSchemaRef === undefined) {
            throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"');
        }
        return {
            schema,
            schemaPath,
            topSchemaRef,
            errSchemaPath,
        };
    }
    throw new Error('either "keyword" or "schema" must be passed');
}
exports.getSubschema = getSubschema;
function extendSubschemaData(subschema, it, { dataProp, dataPropType: dpType, data, dataTypes, propertyName }) {
    if (data !== undefined && dataProp !== undefined) {
        throw new Error('both "data" and "dataProp" passed, only one allowed');
    }
    const { gen } = it;
    if (dataProp !== undefined) {
        const { errorPath, dataPathArr, opts } = it;
        const nextData = gen.let("data", (0, codegen_1._) `${it.data}${(0, codegen_1.getProperty)(dataProp)}`, true);
        dataContextProps(nextData);
        subschema.errorPath = (0, codegen_1.str) `${errorPath}${(0, util_1.getErrorPath)(dataProp, dpType, opts.jsPropertySyntax)}`;
        subschema.parentDataProperty = (0, codegen_1._) `${dataProp}`;
        subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty];
    }
    if (data !== undefined) {
        const nextData = data instanceof codegen_1.Name ? data : gen.let("data", data, true); // replaceable if used once?
        dataContextProps(nextData);
        if (propertyName !== undefined)
            subschema.propertyName = propertyName;
        // TODO something is possibly wrong here with not changing parentDataProperty and not appending dataPathArr
    }
    if (dataTypes)
        subschema.dataTypes = dataTypes;
    function dataContextProps(_nextData) {
        subschema.data = _nextData;
        subschema.dataLevel = it.dataLevel + 1;
        subschema.dataTypes = [];
        it.definedProperties = new Set();
        subschema.parentData = it.data;
        subschema.dataNames = [...it.dataNames, _nextData];
    }
}
exports.extendSubschemaData = extendSubschemaData;
function extendSubschemaMode(subschema, { jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors }) {
    if (compositeRule !== undefined)
        subschema.compositeRule = compositeRule;
    if (createErrors !== undefined)
        subschema.createErrors = createErrors;
    if (allErrors !== undefined)
        subschema.allErrors = allErrors;
    subschema.jtdDiscriminator = jtdDiscriminator; // not inherited
    subschema.jtdMetadata = jtdMetadata; // not inherited
}
exports.extendSubschemaMode = extendSubschemaMode;
//# sourceMappingURL=subschema.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0;
var validate_1 = require("./compile/validate");
Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function () { return validate_1.KeywordCxt; } });
var codegen_1 = require("./compile/codegen");
Object.defineProperty(exports, "_", { enumerable: true, get: function () { return codegen_1._; } });
Object.defineProperty(exports, "str", { enumerable: true, get: function () { return codegen_1.str; } });
Object.defineProperty(exports, "stringify", { enumerable: true, get: function () { return codegen_1.stringify; } });
Object.defineProperty(exports, "nil", { enumerable: true, get: function () { return codegen_1.nil; } });
Object.defineProperty(exports, "Name", { enumerable: true, get: function () { return codegen_1.Name; } });
Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function () { return codegen_1.CodeGen; } });
const validation_error_1 = require("./runtime/validation_error");
const ref_error_1 = require("./compile/ref_error");
const rules_1 = require("./compile/rules");
const compile_1 = require("./compile");
const codegen_2 = require("./compile/codegen");
const resolve_1 = require("./compile/resolve");
const dataType_1 = require("./compile/validate/dataType");
const util_1 = require("./compile/util");
const $dataRefSchema = require("./refs/data.json");
const uri_1 = require("./runtime/uri");
const defaultRegExp = (str, flags) => new RegExp(str, flags);
defaultRegExp.code = "new RegExp";
const META_IGNORE_OPTIONS = ["removeAdditional", "useDefaults", "coerceTypes"];
const EXT_SCOPE_NAMES = new Set([
    "validate",
    "serialize",
    "parse",
    "wrapper",
    "root",
    "schema",
    "keyword",
    "pattern",
    "formats",
    "validate$data",
    "func",
    "obj",
    "Error",
]);
const removedOptions = {
    errorDataPath: "",
    format: "`validateFormats: false` can be used instead.",
    nullable: '"nullable" keyword is supported by default.',
    jsonPointers: "Deprecated jsPropertySyntax can be used instead.",
    extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.",
    missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.",
    processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`",
    sourceCode: "Use option `code: {source: true}`",
    strictDefaults: "It is default now, see option `strict`.",
    strictKeywords: "It is default now, see option `strict`.",
    uniqueItems: '"uniqueItems" keyword is always validated.',
    unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).",
    cache: "Map is used as cache, schema object as key.",
    serialize: "Map is used as cache, schema object as key.",
    ajvErrors: "It is default now.",
};
const deprecatedOptions = {
    ignoreKeywordsWithRef: "",
    jsPropertySyntax: "",
    unicode: '"minLength"/"maxLength" account for unicode characters by default.',
};
const MAX_EXPRESSION = 200;
// eslint-disable-next-line complexity
function requiredOptions(o) {
    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
    const s = o.strict;
    const _optz = (_a = o.code) === null || _a === void 0 ? void 0 : _a.optimize;
    const optimize = _optz === true || _optz === undefined ? 1 : _optz || 0;
    const regExp = (_c = (_b = o.code) === null || _b === void 0 ? void 0 : _b.regExp) !== null && _c !== void 0 ? _c : defaultRegExp;
    const uriResolver = (_d = o.uriResolver) !== null && _d !== void 0 ? _d : uri_1.default;
    return {
        strictSchema: (_f = (_e = o.strictSchema) !== null && _e !== void 0 ? _e : s) !== null && _f !== void 0 ? _f : true,
        strictNumbers: (_h = (_g = o.strictNumbers) !== null && _g !== void 0 ? _g : s) !== null && _h !== void 0 ? _h : true,
        strictTypes: (_k = (_j = o.strictTypes) !== null && _j !== void 0 ? _j : s) !== null && _k !== void 0 ? _k : "log",
        strictTuples: (_m = (_l = o.strictTuples) !== null && _l !== void 0 ? _l : s) !== null && _m !== void 0 ? _m : "log",
        strictRequired: (_p = (_o = o.strictRequired) !== null && _o !== void 0 ? _o : s) !== null && _p !== void 0 ? _p : false,
        code: o.code ? { ...o.code, optimize, regExp } : { optimize, regExp },
        loopRequired: (_q = o.loopRequired) !== null && _q !== void 0 ? _q : MAX_EXPRESSION,
        loopEnum: (_r = o.loopEnum) !== null && _r !== void 0 ? _r : MAX_EXPRESSION,
        meta: (_s = o.meta) !== null && _s !== void 0 ? _s : true,
        messages: (_t = o.messages) !== null && _t !== void 0 ? _t : true,
        inlineRefs: (_u = o.inlineRefs) !== null && _u !== void 0 ? _u : true,
        schemaId: (_v = o.schemaId) !== null && _v !== void 0 ? _v : "$id",
        addUsedSchema: (_w = o.addUsedSchema) !== null && _w !== void 0 ? _w : true,
        validateSchema: (_x = o.validateSchema) !== null && _x !== void 0 ? _x : true,
        validateFormats: (_y = o.validateFormats) !== null && _y !== void 0 ? _y : true,
        unicodeRegExp: (_z = o.unicodeRegExp) !== null && _z !== void 0 ? _z : true,
        int32range: (_0 = o.int32range) !== null && _0 !== void 0 ? _0 : true,
        uriResolver: uriResolver,
    };
}
class Ajv {
    constructor(opts = {}) {
        this.schemas = {};
        this.refs = {};
        this.formats = {};
        this._compilations = new Set();
        this._loading = {};
        this._cache = new Map();
        opts = this.opts = { ...opts, ...requiredOptions(opts) };
        const { es5, lines } = this.opts.code;
        this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines });
        this.logger = getLogger(opts.logger);
        const formatOpt = opts.validateFormats;
        opts.validateFormats = false;
        this.RULES = (0, rules_1.getRules)();
        checkOptions.call(this, removedOptions, opts, "NOT SUPPORTED");
        checkOptions.call(this, deprecatedOptions, opts, "DEPRECATED", "warn");
        this._metaOpts = getMetaSchemaOptions.call(this);
        if (opts.formats)
            addInitialFormats.call(this);
        this._addVocabularies();
        this._addDefaultMetaSchema();
        if (opts.keywords)
            addInitialKeywords.call(this, opts.keywords);
        if (typeof opts.meta == "object")
            this.addMetaSchema(opts.meta);
        addInitialSchemas.call(this);
        opts.validateFormats = formatOpt;
    }
    _addVocabularies() {
        this.addKeyword("$async");
    }
    _addDefaultMetaSchema() {
        const { $data, meta, schemaId } = this.opts;
        let _dataRefSchema = $dataRefSchema;
        if (schemaId === "id") {
            _dataRefSchema = { ...$dataRefSchema };
            _dataRefSchema.id = _dataRefSchema.$id;
            delete _dataRefSchema.$id;
        }
        if (meta && $data)
            this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false);
    }
    defaultMeta() {
        const { meta, schemaId } = this.opts;
        return (this.opts.defaultMeta = typeof meta == "object" ? meta[schemaId] || meta : undefined);
    }
    validate(schemaKeyRef, // key, ref or schema object
    // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
    data // to be validated
    ) {
        let v;
        if (typeof schemaKeyRef == "string") {
            v = this.getSchema(schemaKeyRef);
            if (!v)
                throw new Error(`no schema with key or ref "${schemaKeyRef}"`);
        }
        else {
            v = this.compile(schemaKeyRef);
        }
        const valid = v(data);
        if (!("$async" in v))
            this.errors = v.errors;
        return valid;
    }
    compile(schema, _meta) {
        const sch = this._addSchema(schema, _meta);
        return (sch.validate || this._compileSchemaEnv(sch));
    }
    compileAsync(schema, meta) {
        if (typeof this.opts.loadSchema != "function") {
            throw new Error("options.loadSchema should be a function");
        }
        const { loadSchema } = this.opts;
        return runCompileAsync.call(this, schema, meta);
        async function runCompileAsync(_schema, _meta) {
            await loadMetaSchema.call(this, _schema.$schema);
            const sch = this._addSchema(_schema, _meta);
            return sch.validate || _compileAsync.call(this, sch);
        }
        async function loadMetaSchema($ref) {
            if ($ref && !this.getSchema($ref)) {
                await runCompileAsync.call(this, { $ref }, true);
            }
        }
        async function _compileAsync(sch) {
            try {
                return this._compileSchemaEnv(sch);
            }
            catch (e) {
                if (!(e instanceof ref_error_1.default))
                    throw e;
                checkLoaded.call(this, e);
                await loadMissingSchema.call(this, e.missingSchema);
                return _compileAsync.call(this, sch);
            }
        }
        function checkLoaded({ missingSchema: ref, missingRef }) {
            if (this.refs[ref]) {
                throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`);
            }
        }
        async function loadMissingSchema(ref) {
            const _schema = await _loadSchema.call(this, ref);
            if (!this.refs[ref])
                await loadMetaSchema.call(this, _schema.$schema);
            if (!this.refs[ref])
                this.addSchema(_schema, ref, meta);
        }
        async function _loadSchema(ref) {
            const p = this._loading[ref];
            if (p)
                return p;
            try {
                return await (this._loading[ref] = loadSchema(ref));
            }
            finally {
                delete this._loading[ref];
            }
        }
    }
    // Adds schema to the instance
    addSchema(schema, // If array is passed, `key` will be ignored
    key, // Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.
    _meta, // true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.
    _validateSchema = this.opts.validateSchema // false to skip schema validation. Used internally, option validateSchema should be used instead.
    ) {
        if (Array.isArray(schema)) {
            for (const sch of schema)
                this.addSchema(sch, undefined, _meta, _validateSchema);
            return this;
        }
        let id;
        if (typeof schema === "object") {
            const { schemaId } = this.opts;
            id = schema[schemaId];
            if (id !== undefined && typeof id != "string") {
                throw new Error(`schema ${schemaId} must be string`);
            }
        }
        key = (0, resolve_1.normalizeId)(key || id);
        this._checkUnique(key);
        this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true);
        return this;
    }
    // Add schema that will be used to validate other schemas
    // options in META_IGNORE_OPTIONS are alway set to false
    addMetaSchema(schema, key, // schema key
    _validateSchema = this.opts.validateSchema // false to skip schema validation, can be used to override validateSchema option for meta-schema
    ) {
        this.addSchema(schema, key, true, _validateSchema);
        return this;
    }
    //  Validate schema against its meta-schema
    validateSchema(schema, throwOrLogError) {
        if (typeof schema == "boolean")
            return true;
        let $schema;
        $schema = schema.$schema;
        if ($schema !== undefined && typeof $schema != "string") {
            throw new Error("$schema must be a string");
        }
        $schema = $schema || this.opts.defaultMeta || this.defaultMeta();
        if (!$schema) {
            this.logger.warn("meta-schema not available");
            this.errors = null;
            return true;
        }
        const valid = this.validate($schema, schema);
        if (!valid && throwOrLogError) {
            const message = "schema is invalid: " + this.errorsText();
            if (this.opts.validateSchema === "log")
                this.logger.error(message);
            else
                throw new Error(message);
        }
        return valid;
    }
    // Get compiled schema by `key` or `ref`.
    // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id)
    getSchema(keyRef) {
        let sch;
        while (typeof (sch = getSchEnv.call(this, keyRef)) == "string")
            keyRef = sch;
        if (sch === undefined) {
            const { schemaId } = this.opts;
            const root = new compile_1.SchemaEnv({ schema: {}, schemaId });
            sch = compile_1.resolveSchema.call(this, root, keyRef);
            if (!sch)
                return;
            this.refs[keyRef] = sch;
        }
        return (sch.validate || this._compileSchemaEnv(sch));
    }
    // Remove cached schema(s).
    // If no parameter is passed all schemas but meta-schemas are removed.
    // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.
    // Even if schema is referenced by other schemas it still can be removed as other schemas have local references.
    removeSchema(schemaKeyRef) {
        if (schemaKeyRef instanceof RegExp) {
            this._removeAllSchemas(this.schemas, schemaKeyRef);
            this._removeAllSchemas(this.refs, schemaKeyRef);
            return this;
        }
        switch (typeof schemaKeyRef) {
            case "undefined":
                this._removeAllSchemas(this.schemas);
                this._removeAllSchemas(this.refs);
                this._cache.clear();
                return this;
            case "string": {
                const sch = getSchEnv.call(this, schemaKeyRef);
                if (typeof sch == "object")
                    this._cache.delete(sch.schema);
                delete this.schemas[schemaKeyRef];
                delete this.refs[schemaKeyRef];
                return this;
            }
            case "object": {
                const cacheKey = schemaKeyRef;
                this._cache.delete(cacheKey);
                let id = schemaKeyRef[this.opts.schemaId];
                if (id) {
                    id = (0, resolve_1.normalizeId)(id);
                    delete this.schemas[id];
                    delete this.refs[id];
                }
                return this;
            }
            default:
                throw new Error("ajv.removeSchema: invalid parameter");
        }
    }
    // add "vocabulary" - a collection of keywords
    addVocabulary(definitions) {
        for (const def of definitions)
            this.addKeyword(def);
        return this;
    }
    addKeyword(kwdOrDef, def // deprecated
    ) {
        let keyword;
        if (typeof kwdOrDef == "string") {
            keyword = kwdOrDef;
            if (typeof def == "object") {
                this.logger.warn("these parameters are deprecated, see docs for addKeyword");
                def.keyword = keyword;
            }
        }
        else if (typeof kwdOrDef == "object" && def === undefined) {
            def = kwdOrDef;
            keyword = def.keyword;
            if (Array.isArray(keyword) && !keyword.length) {
                throw new Error("addKeywords: keyword must be string or non-empty array");
            }
        }
        else {
            throw new Error("invalid addKeywords parameters");
        }
        checkKeyword.call(this, keyword, def);
        if (!def) {
            (0, util_1.eachItem)(keyword, (kwd) => addRule.call(this, kwd));
            return this;
        }
        keywordMetaschema.call(this, def);
        const definition = {
            ...def,
            type: (0, dataType_1.getJSONTypes)(def.type),
            schemaType: (0, dataType_1.getJSONTypes)(def.schemaType),
        };
        (0, util_1.eachItem)(keyword, definition.type.length === 0
            ? (k) => addRule.call(this, k, definition)
            : (k) => definition.type.forEach((t) => addRule.call(this, k, definition, t)));
        return this;
    }
    getKeyword(keyword) {
        const rule = this.RULES.all[keyword];
        return typeof rule == "object" ? rule.definition : !!rule;
    }
    // Remove keyword
    removeKeyword(keyword) {
        // TODO return type should be Ajv
        const { RULES } = this;
        delete RULES.keywords[keyword];
        delete RULES.all[keyword];
        for (const group of RULES.rules) {
            const i = group.rules.findIndex((rule) => rule.keyword === keyword);
            if (i >= 0)
                group.rules.splice(i, 1);
        }
        return this;
    }
    // Add format
    addFormat(name, format) {
        if (typeof format == "string")
            format = new RegExp(format);
        this.formats[name] = format;
        return this;
    }
    errorsText(errors = this.errors, // optional array of validation errors
    { separator = ", ", dataVar = "data" } = {} // optional options with properties `separator` and `dataVar`
    ) {
        if (!errors || errors.length === 0)
            return "No errors";
        return errors
            .map((e) => `${dataVar}${e.instancePath} ${e.message}`)
            .reduce((text, msg) => text + separator + msg);
    }
    $dataMetaSchema(metaSchema, keywordsJsonPointers) {
        const rules = this.RULES.all;
        metaSchema = JSON.parse(JSON.stringify(metaSchema));
        for (const jsonPointer of keywordsJsonPointers) {
            const segments = jsonPointer.split("/").slice(1); // first segment is an empty string
            let keywords = metaSchema;
            for (const seg of segments)
                keywords = keywords[seg];
            for (const key in rules) {
                const rule = rules[key];
                if (typeof rule != "object")
                    continue;
                const { $data } = rule.definition;
                const schema = keywords[key];
                if ($data && schema)
                    keywords[key] = schemaOrData(schema);
            }
        }
        return metaSchema;
    }
    _removeAllSchemas(schemas, regex) {
        for (const keyRef in schemas) {
            const sch = schemas[keyRef];
            if (!regex || regex.test(keyRef)) {
                if (typeof sch == "string") {
                    delete schemas[keyRef];
                }
                else if (sch && !sch.meta) {
                    this._cache.delete(sch.schema);
                    delete schemas[keyRef];
                }
            }
        }
    }
    _addSchema(schema, meta, baseId, validateSchema = this.opts.validateSchema, addSchema = this.opts.addUsedSchema) {
        let id;
        const { schemaId } = this.opts;
        if (typeof schema == "object") {
            id = schema[schemaId];
        }
        else {
            if (this.opts.jtd)
                throw new Error("schema must be object");
            else if (typeof schema != "boolean")
                throw new Error("schema must be object or boolean");
        }
        let sch = this._cache.get(schema);
        if (sch !== undefined)
            return sch;
        baseId = (0, resolve_1.normalizeId)(id || baseId);
        const localRefs = resolve_1.getSchemaRefs.call(this, schema, baseId);
        sch = new compile_1.SchemaEnv({ schema, schemaId, meta, baseId, localRefs });
        this._cache.set(sch.schema, sch);
        if (addSchema && !baseId.startsWith("#")) {
            // TODO atm it is allowed to overwrite schemas without id (instead of not adding them)
            if (baseId)
                this._checkUnique(baseId);
            this.refs[baseId] = sch;
        }
        if (validateSchema)
            this.validateSchema(schema, true);
        return sch;
    }
    _checkUnique(id) {
        if (this.schemas[id] || this.refs[id]) {
            throw new Error(`schema with key or id "${id}" already exists`);
        }
    }
    _compileSchemaEnv(sch) {
        if (sch.meta)
            this._compileMetaSchema(sch);
        else
            compile_1.compileSchema.call(this, sch);
        /* istanbul ignore if */
        if (!sch.validate)
            throw new Error("ajv implementation error");
        return sch.validate;
    }
    _compileMetaSchema(sch) {
        const currentOpts = this.opts;
        this.opts = this._metaOpts;
        try {
            compile_1.compileSchema.call(this, sch);
        }
        finally {
            this.opts = currentOpts;
        }
    }
}
Ajv.ValidationError = validation_error_1.default;
Ajv.MissingRefError = ref_error_1.default;
exports.default = Ajv;
function checkOptions(checkOpts, options, msg, log = "error") {
    for (const key in checkOpts) {
        const opt = key;
        if (opt in options)
            this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`);
    }
}
function getSchEnv(keyRef) {
    keyRef = (0, resolve_1.normalizeId)(keyRef); // TODO tests fail without this line
    return this.schemas[keyRef] || this.refs[keyRef];
}
function addInitialSchemas() {
    const optsSchemas = this.opts.schemas;
    if (!optsSchemas)
        return;
    if (Array.isArray(optsSchemas))
        this.addSchema(optsSchemas);
    else
        for (const key in optsSchemas)
            this.addSchema(optsSchemas[key], key);
}
function addInitialFormats() {
    for (const name in this.opts.formats) {
        const format = this.opts.formats[name];
        if (format)
            this.addFormat(name, format);
    }
}
function addInitialKeywords(defs) {
    if (Array.isArray(defs)) {
        this.addVocabulary(defs);
        return;
    }
    this.logger.warn("keywords option as map is deprecated, pass array");
    for (const keyword in defs) {
        const def = defs[keyword];
        if (!def.keyword)
            def.keyword = keyword;
        this.addKeyword(def);
    }
}
function getMetaSchemaOptions() {
    const metaOpts = { ...this.opts };
    for (const opt of META_IGNORE_OPTIONS)
        delete metaOpts[opt];
    return metaOpts;
}
const noLogs = { log() { }, warn() { }, error() { } };
function getLogger(logger) {
    if (logger === false)
        return noLogs;
    if (logger === undefined)
        return console;
    if (logger.log && logger.warn && logger.error)
        return logger;
    throw new Error("logger must implement log, warn and error methods");
}
const KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i;
function checkKeyword(keyword, def) {
    const { RULES } = this;
    (0, util_1.eachItem)(keyword, (kwd) => {
        if (RULES.keywords[kwd])
            throw new Error(`Keyword ${kwd} is already defined`);
        if (!KEYWORD_NAME.test(kwd))
            throw new Error(`Keyword ${kwd} has invalid name`);
    });
    if (!def)
        return;
    if (def.$data && !("code" in def || "validate" in def)) {
        throw new Error('$data keyword must have "code" or "validate" function');
    }
}
function addRule(keyword, definition, dataType) {
    var _a;
    const post = definition === null || definition === void 0 ? void 0 : definition.post;
    if (dataType && post)
        throw new Error('keyword with "post" flag cannot have "type"');
    const { RULES } = this;
    let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType);
    if (!ruleGroup) {
        ruleGroup = { type: dataType, rules: [] };
        RULES.rules.push(ruleGroup);
    }
    RULES.keywords[keyword] = true;
    if (!definition)
        return;
    const rule = {
        keyword,
        definition: {
            ...definition,
            type: (0, dataType_1.getJSONTypes)(definition.type),
            schemaType: (0, dataType_1.getJSONTypes)(definition.schemaType),
        },
    };
    if (definition.before)
        addBeforeRule.call(this, ruleGroup, rule, definition.before);
    else
        ruleGroup.rules.push(rule);
    RULES.all[keyword] = rule;
    (_a = definition.implements) === null || _a === void 0 ? void 0 : _a.forEach((kwd) => this.addKeyword(kwd));
}
function addBeforeRule(ruleGroup, rule, before) {
    const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before);
    if (i >= 0) {
        ruleGroup.rules.splice(i, 0, rule);
    }
    else {
        ruleGroup.rules.push(rule);
        this.logger.warn(`rule ${before} is not defined`);
    }
}
function keywordMetaschema(def) {
    let { metaSchema } = def;
    if (metaSchema === undefined)
        return;
    if (def.$data && this.opts.$data)
        metaSchema = schemaOrData(metaSchema);
    def.validateSchema = this.compile(metaSchema, true);
}
const $dataRef = {
    $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",
};
function schemaOrData(schema) {
    return { anyOf: [schema, $dataRef] };
}
//# sourceMappingURL=core.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0;
const core_1 = require("./core");
const jtd_1 = require("./vocabularies/jtd");
const jtd_schema_1 = require("./refs/jtd-schema");
const serialize_1 = require("./compile/jtd/serialize");
const parse_1 = require("./compile/jtd/parse");
const META_SCHEMA_ID = "JTD-meta-schema";
class Ajv extends core_1.default {
    constructor(opts = {}) {
        super({
            ...opts,
            jtd: true,
        });
    }
    _addVocabularies() {
        super._addVocabularies();
        this.addVocabulary(jtd_1.default);
    }
    _addDefaultMetaSchema() {
        super._addDefaultMetaSchema();
        if (!this.opts.meta)
            return;
        this.addMetaSchema(jtd_schema_1.default, META_SCHEMA_ID, false);
    }
    defaultMeta() {
        return (this.opts.defaultMeta =
            super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : undefined));
    }
    compileSerializer(schema) {
        const sch = this._addSchema(schema);
        return sch.serialize || this._compileSerializer(sch);
    }
    compileParser(schema) {
        const sch = this._addSchema(schema);
        return (sch.parse || this._compileParser(sch));
    }
    _compileSerializer(sch) {
        serialize_1.default.call(this, sch, sch.schema.definitions || {});
        /* istanbul ignore if */
        if (!sch.serialize)
            throw new Error("ajv implementation error");
        return sch.serialize;
    }
    _compileParser(sch) {
        parse_1.default.call(this, sch, sch.schema.definitions || {});
        /* istanbul ignore if */
        if (!sch.parse)
            throw new Error("ajv implementation error");
        return sch.parse;
    }
}
exports.Ajv = Ajv;
module.exports = exports = Ajv;
module.exports.Ajv = Ajv;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = Ajv;
var validate_1 = require("./compile/validate");
Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function () { return validate_1.KeywordCxt; } });
var codegen_1 = require("./compile/codegen");
Object.defineProperty(exports, "_", { enumerable: true, get: function () { return codegen_1._; } });
Object.defineProperty(exports, "str", { enumerable: true, get: function () { return codegen_1.str; } });
Object.defineProperty(exports, "stringify", { enumerable: true, get: function () { return codegen_1.stringify; } });
Object.defineProperty(exports, "nil", { enumerable: true, get: function () { return codegen_1.nil; } });
Object.defineProperty(exports, "Name", { enumerable: true, get: function () { return codegen_1.Name; } });
Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function () { return codegen_1.CodeGen; } });
var validation_error_1 = require("./runtime/validation_error");
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return validation_error_1.default; } });
var ref_error_1 = require("./compile/ref_error");
Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function () { return ref_error_1.default; } });
//# sourceMappingURL=jtd.js.map{
  "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",
  "description": "Meta-schema for $data reference (JSON AnySchema extension proposal)",
  "type": "object",
  "required": ["$data"],
  "properties": {
    "$data": {
      "type": "string",
      "anyOf": [{"format": "relative-json-pointer"}, {"format": "json-pointer"}]
    }
  },
  "additionalProperties": false
}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const metaSchema = require("./schema.json");
const applicator = require("./meta/applicator.json");
const content = require("./meta/content.json");
const core = require("./meta/core.json");
const format = require("./meta/format.json");
const metadata = require("./meta/meta-data.json");
const validation = require("./meta/validation.json");
const META_SUPPORT_DATA = ["/properties"];
function addMetaSchema2019($data) {
    ;
    [
        metaSchema,
        applicator,
        content,
        core,
        with$data(this, format),
        metadata,
        with$data(this, validation),
    ].forEach((sch) => this.addMetaSchema(sch, undefined, false));
    return this;
    function with$data(ajv, sch) {
        return $data ? ajv.$dataMetaSchema(sch, META_SUPPORT_DATA) : sch;
    }
}
exports.default = addMetaSchema2019;
//# sourceMappingURL=index.js.map{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/applicator",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/applicator": true
  },
  "$recursiveAnchor": true,

  "title": "Applicator vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "additionalItems": {"$recursiveRef": "#"},
    "unevaluatedItems": {"$recursiveRef": "#"},
    "items": {
      "anyOf": [{"$recursiveRef": "#"}, {"$ref": "#/$defs/schemaArray"}]
    },
    "contains": {"$recursiveRef": "#"},
    "additionalProperties": {"$recursiveRef": "#"},
    "unevaluatedProperties": {"$recursiveRef": "#"},
    "properties": {
      "type": "object",
      "additionalProperties": {"$recursiveRef": "#"},
      "default": {}
    },
    "patternProperties": {
      "type": "object",
      "additionalProperties": {"$recursiveRef": "#"},
      "propertyNames": {"format": "regex"},
      "default": {}
    },
    "dependentSchemas": {
      "type": "object",
      "additionalProperties": {
        "$recursiveRef": "#"
      }
    },
    "propertyNames": {"$recursiveRef": "#"},
    "if": {"$recursiveRef": "#"},
    "then": {"$recursiveRef": "#"},
    "else": {"$recursiveRef": "#"},
    "allOf": {"$ref": "#/$defs/schemaArray"},
    "anyOf": {"$ref": "#/$defs/schemaArray"},
    "oneOf": {"$ref": "#/$defs/schemaArray"},
    "not": {"$recursiveRef": "#"}
  },
  "$defs": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$recursiveRef": "#"}
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/content",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/content": true
  },
  "$recursiveAnchor": true,

  "title": "Content vocabulary meta-schema",

  "type": ["object", "boolean"],
  "properties": {
    "contentMediaType": {"type": "string"},
    "contentEncoding": {"type": "string"},
    "contentSchema": {"$recursiveRef": "#"}
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/core",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/core": true
  },
  "$recursiveAnchor": true,

  "title": "Core vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "$id": {
      "type": "string",
      "format": "uri-reference",
      "$comment": "Non-empty fragments not allowed.",
      "pattern": "^[^#]*#?$"
    },
    "$schema": {
      "type": "string",
      "format": "uri"
    },
    "$anchor": {
      "type": "string",
      "pattern": "^[A-Za-z][-A-Za-z0-9.:_]*$"
    },
    "$ref": {
      "type": "string",
      "format": "uri-reference"
    },
    "$recursiveRef": {
      "type": "string",
      "format": "uri-reference"
    },
    "$recursiveAnchor": {
      "type": "boolean",
      "default": false
    },
    "$vocabulary": {
      "type": "object",
      "propertyNames": {
        "type": "string",
        "format": "uri"
      },
      "additionalProperties": {
        "type": "boolean"
      }
    },
    "$comment": {
      "type": "string"
    },
    "$defs": {
      "type": "object",
      "additionalProperties": {"$recursiveRef": "#"},
      "default": {}
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/format",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/format": true
  },
  "$recursiveAnchor": true,

  "title": "Format vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "format": {"type": "string"}
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/meta-data",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/meta-data": true
  },
  "$recursiveAnchor": true,

  "title": "Meta-data vocabulary meta-schema",

  "type": ["object", "boolean"],
  "properties": {
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "default": true,
    "deprecated": {
      "type": "boolean",
      "default": false
    },
    "readOnly": {
      "type": "boolean",
      "default": false
    },
    "writeOnly": {
      "type": "boolean",
      "default": false
    },
    "examples": {
      "type": "array",
      "items": true
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/validation",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/validation": true
  },
  "$recursiveAnchor": true,

  "title": "Validation vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "multipleOf": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "maximum": {
      "type": "number"
    },
    "exclusiveMaximum": {
      "type": "number"
    },
    "minimum": {
      "type": "number"
    },
    "exclusiveMinimum": {
      "type": "number"
    },
    "maxLength": {"$ref": "#/$defs/nonNegativeInteger"},
    "minLength": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "pattern": {
      "type": "string",
      "format": "regex"
    },
    "maxItems": {"$ref": "#/$defs/nonNegativeInteger"},
    "minItems": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "uniqueItems": {
      "type": "boolean",
      "default": false
    },
    "maxContains": {"$ref": "#/$defs/nonNegativeInteger"},
    "minContains": {
      "$ref": "#/$defs/nonNegativeInteger",
      "default": 1
    },
    "maxProperties": {"$ref": "#/$defs/nonNegativeInteger"},
    "minProperties": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "required": {"$ref": "#/$defs/stringArray"},
    "dependentRequired": {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/$defs/stringArray"
      }
    },
    "const": true,
    "enum": {
      "type": "array",
      "items": true
    },
    "type": {
      "anyOf": [
        {"$ref": "#/$defs/simpleTypes"},
        {
          "type": "array",
          "items": {"$ref": "#/$defs/simpleTypes"},
          "minItems": 1,
          "uniqueItems": true
        }
      ]
    }
  },
  "$defs": {
    "nonNegativeInteger": {
      "type": "integer",
      "minimum": 0
    },
    "nonNegativeIntegerDefault0": {
      "$ref": "#/$defs/nonNegativeInteger",
      "default": 0
    },
    "simpleTypes": {
      "enum": ["array", "boolean", "integer", "null", "number", "object", "string"]
    },
    "stringArray": {
      "type": "array",
      "items": {"type": "string"},
      "uniqueItems": true,
      "default": []
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/schema",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/core": true,
    "https://json-schema.org/draft/2019-09/vocab/applicator": true,
    "https://json-schema.org/draft/2019-09/vocab/validation": true,
    "https://json-schema.org/draft/2019-09/vocab/meta-data": true,
    "https://json-schema.org/draft/2019-09/vocab/format": false,
    "https://json-schema.org/draft/2019-09/vocab/content": true
  },
  "$recursiveAnchor": true,

  "title": "Core and Validation specifications meta-schema",
  "allOf": [
    {"$ref": "meta/core"},
    {"$ref": "meta/applicator"},
    {"$ref": "meta/validation"},
    {"$ref": "meta/meta-data"},
    {"$ref": "meta/format"},
    {"$ref": "meta/content"}
  ],
  "type": ["object", "boolean"],
  "properties": {
    "definitions": {
      "$comment": "While no longer an official keyword as it is replaced by $defs, this keyword is retained in the meta-schema to prevent incompatible extensions as it remains in common use.",
      "type": "object",
      "additionalProperties": {"$recursiveRef": "#"},
      "default": {}
    },
    "dependencies": {
      "$comment": "\"dependencies\" is no longer a keyword, but schema authors should avoid redefining it to facilitate a smooth transition to \"dependentSchemas\" and \"dependentRequired\"",
      "type": "object",
      "additionalProperties": {
        "anyOf": [{"$recursiveRef": "#"}, {"$ref": "meta/validation#/$defs/stringArray"}]
      }
    }
  }
}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const metaSchema = require("./schema.json");
const applicator = require("./meta/applicator.json");
const unevaluated = require("./meta/unevaluated.json");
const content = require("./meta/content.json");
const core = require("./meta/core.json");
const format = require("./meta/format-annotation.json");
const metadata = require("./meta/meta-data.json");
const validation = require("./meta/validation.json");
const META_SUPPORT_DATA = ["/properties"];
function addMetaSchema2020($data) {
    ;
    [
        metaSchema,
        applicator,
        unevaluated,
        content,
        core,
        with$data(this, format),
        metadata,
        with$data(this, validation),
    ].forEach((sch) => this.addMetaSchema(sch, undefined, false));
    return this;
    function with$data(ajv, sch) {
        return $data ? ajv.$dataMetaSchema(sch, META_SUPPORT_DATA) : sch;
    }
}
exports.default = addMetaSchema2020;
//# sourceMappingURL=index.js.map{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/applicator",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/applicator": true
  },
  "$dynamicAnchor": "meta",

  "title": "Applicator vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "prefixItems": {"$ref": "#/$defs/schemaArray"},
    "items": {"$dynamicRef": "#meta"},
    "contains": {"$dynamicRef": "#meta"},
    "additionalProperties": {"$dynamicRef": "#meta"},
    "properties": {
      "type": "object",
      "additionalProperties": {"$dynamicRef": "#meta"},
      "default": {}
    },
    "patternProperties": {
      "type": "object",
      "additionalProperties": {"$dynamicRef": "#meta"},
      "propertyNames": {"format": "regex"},
      "default": {}
    },
    "dependentSchemas": {
      "type": "object",
      "additionalProperties": {"$dynamicRef": "#meta"},
      "default": {}
    },
    "propertyNames": {"$dynamicRef": "#meta"},
    "if": {"$dynamicRef": "#meta"},
    "then": {"$dynamicRef": "#meta"},
    "else": {"$dynamicRef": "#meta"},
    "allOf": {"$ref": "#/$defs/schemaArray"},
    "anyOf": {"$ref": "#/$defs/schemaArray"},
    "oneOf": {"$ref": "#/$defs/schemaArray"},
    "not": {"$dynamicRef": "#meta"}
  },
  "$defs": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$dynamicRef": "#meta"}
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/content",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/content": true
  },
  "$dynamicAnchor": "meta",

  "title": "Content vocabulary meta-schema",

  "type": ["object", "boolean"],
  "properties": {
    "contentEncoding": {"type": "string"},
    "contentMediaType": {"type": "string"},
    "contentSchema": {"$dynamicRef": "#meta"}
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/core",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/core": true
  },
  "$dynamicAnchor": "meta",

  "title": "Core vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "$id": {
      "$ref": "#/$defs/uriReferenceString",
      "$comment": "Non-empty fragments not allowed.",
      "pattern": "^[^#]*#?$"
    },
    "$schema": {"$ref": "#/$defs/uriString"},
    "$ref": {"$ref": "#/$defs/uriReferenceString"},
    "$anchor": {"$ref": "#/$defs/anchorString"},
    "$dynamicRef": {"$ref": "#/$defs/uriReferenceString"},
    "$dynamicAnchor": {"$ref": "#/$defs/anchorString"},
    "$vocabulary": {
      "type": "object",
      "propertyNames": {"$ref": "#/$defs/uriString"},
      "additionalProperties": {
        "type": "boolean"
      }
    },
    "$comment": {
      "type": "string"
    },
    "$defs": {
      "type": "object",
      "additionalProperties": {"$dynamicRef": "#meta"}
    }
  },
  "$defs": {
    "anchorString": {
      "type": "string",
      "pattern": "^[A-Za-z_][-A-Za-z0-9._]*$"
    },
    "uriString": {
      "type": "string",
      "format": "uri"
    },
    "uriReferenceString": {
      "type": "string",
      "format": "uri-reference"
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/format-annotation",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/format-annotation": true
  },
  "$dynamicAnchor": "meta",

  "title": "Format vocabulary meta-schema for annotation results",
  "type": ["object", "boolean"],
  "properties": {
    "format": {"type": "string"}
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/meta-data",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/meta-data": true
  },
  "$dynamicAnchor": "meta",

  "title": "Meta-data vocabulary meta-schema",

  "type": ["object", "boolean"],
  "properties": {
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "default": true,
    "deprecated": {
      "type": "boolean",
      "default": false
    },
    "readOnly": {
      "type": "boolean",
      "default": false
    },
    "writeOnly": {
      "type": "boolean",
      "default": false
    },
    "examples": {
      "type": "array",
      "items": true
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/unevaluated",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/unevaluated": true
  },
  "$dynamicAnchor": "meta",

  "title": "Unevaluated applicator vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "unevaluatedItems": {"$dynamicRef": "#meta"},
    "unevaluatedProperties": {"$dynamicRef": "#meta"}
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/validation",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/validation": true
  },
  "$dynamicAnchor": "meta",

  "title": "Validation vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "type": {
      "anyOf": [
        {"$ref": "#/$defs/simpleTypes"},
        {
          "type": "array",
          "items": {"$ref": "#/$defs/simpleTypes"},
          "minItems": 1,
          "uniqueItems": true
        }
      ]
    },
    "const": true,
    "enum": {
      "type": "array",
      "items": true
    },
    "multipleOf": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "maximum": {
      "type": "number"
    },
    "exclusiveMaximum": {
      "type": "number"
    },
    "minimum": {
      "type": "number"
    },
    "exclusiveMinimum": {
      "type": "number"
    },
    "maxLength": {"$ref": "#/$defs/nonNegativeInteger"},
    "minLength": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "pattern": {
      "type": "string",
      "format": "regex"
    },
    "maxItems": {"$ref": "#/$defs/nonNegativeInteger"},
    "minItems": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "uniqueItems": {
      "type": "boolean",
      "default": false
    },
    "maxContains": {"$ref": "#/$defs/nonNegativeInteger"},
    "minContains": {
      "$ref": "#/$defs/nonNegativeInteger",
      "default": 1
    },
    "maxProperties": {"$ref": "#/$defs/nonNegativeInteger"},
    "minProperties": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "required": {"$ref": "#/$defs/stringArray"},
    "dependentRequired": {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/$defs/stringArray"
      }
    }
  },
  "$defs": {
    "nonNegativeInteger": {
      "type": "integer",
      "minimum": 0
    },
    "nonNegativeIntegerDefault0": {
      "$ref": "#/$defs/nonNegativeInteger",
      "default": 0
    },
    "simpleTypes": {
      "enum": ["array", "boolean", "integer", "null", "number", "object", "string"]
    },
    "stringArray": {
      "type": "array",
      "items": {"type": "string"},
      "uniqueItems": true,
      "default": []
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/schema",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/core": true,
    "https://json-schema.org/draft/2020-12/vocab/applicator": true,
    "https://json-schema.org/draft/2020-12/vocab/unevaluated": true,
    "https://json-schema.org/draft/2020-12/vocab/validation": true,
    "https://json-schema.org/draft/2020-12/vocab/meta-data": true,
    "https://json-schema.org/draft/2020-12/vocab/format-annotation": true,
    "https://json-schema.org/draft/2020-12/vocab/content": true
  },
  "$dynamicAnchor": "meta",

  "title": "Core and Validation specifications meta-schema",
  "allOf": [
    {"$ref": "meta/core"},
    {"$ref": "meta/applicator"},
    {"$ref": "meta/unevaluated"},
    {"$ref": "meta/validation"},
    {"$ref": "meta/meta-data"},
    {"$ref": "meta/format-annotation"},
    {"$ref": "meta/content"}
  ],
  "type": ["object", "boolean"],
  "$comment": "This meta-schema also defines keywords that have appeared in previous drafts in order to prevent incompatible extensions as they remain in common use.",
  "properties": {
    "definitions": {
      "$comment": "\"definitions\" has been replaced by \"$defs\".",
      "type": "object",
      "additionalProperties": {"$dynamicRef": "#meta"},
      "deprecated": true,
      "default": {}
    },
    "dependencies": {
      "$comment": "\"dependencies\" has been split and replaced by \"dependentSchemas\" and \"dependentRequired\" in order to serve their differing semantics.",
      "type": "object",
      "additionalProperties": {
        "anyOf": [{"$dynamicRef": "#meta"}, {"$ref": "meta/validation#/$defs/stringArray"}]
      },
      "deprecated": true,
      "default": {}
    },
    "$recursiveAnchor": {
      "$comment": "\"$recursiveAnchor\" has been replaced by \"$dynamicAnchor\".",
      "$ref": "meta/core#/$defs/anchorString",
      "deprecated": true
    },
    "$recursiveRef": {
      "$comment": "\"$recursiveRef\" has been replaced by \"$dynamicRef\".",
      "$ref": "meta/core#/$defs/uriReferenceString",
      "deprecated": true
    }
  }
}
{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "$id": "http://json-schema.org/draft-06/schema#",
  "title": "Core schema meta-schema",
  "definitions": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$ref": "#"}
    },
    "nonNegativeInteger": {
      "type": "integer",
      "minimum": 0
    },
    "nonNegativeIntegerDefault0": {
      "allOf": [{"$ref": "#/definitions/nonNegativeInteger"}, {"default": 0}]
    },
    "simpleTypes": {
      "enum": ["array", "boolean", "integer", "null", "number", "object", "string"]
    },
    "stringArray": {
      "type": "array",
      "items": {"type": "string"},
      "uniqueItems": true,
      "default": []
    }
  },
  "type": ["object", "boolean"],
  "properties": {
    "$id": {
      "type": "string",
      "format": "uri-reference"
    },
    "$schema": {
      "type": "string",
      "format": "uri"
    },
    "$ref": {
      "type": "string",
      "format": "uri-reference"
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "default": {},
    "examples": {
      "type": "array",
      "items": {}
    },
    "multipleOf": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "maximum": {
      "type": "number"
    },
    "exclusiveMaximum": {
      "type": "number"
    },
    "minimum": {
      "type": "number"
    },
    "exclusiveMinimum": {
      "type": "number"
    },
    "maxLength": {"$ref": "#/definitions/nonNegativeInteger"},
    "minLength": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "pattern": {
      "type": "string",
      "format": "regex"
    },
    "additionalItems": {"$ref": "#"},
    "items": {
      "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/schemaArray"}],
      "default": {}
    },
    "maxItems": {"$ref": "#/definitions/nonNegativeInteger"},
    "minItems": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "uniqueItems": {
      "type": "boolean",
      "default": false
    },
    "contains": {"$ref": "#"},
    "maxProperties": {"$ref": "#/definitions/nonNegativeInteger"},
    "minProperties": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "required": {"$ref": "#/definitions/stringArray"},
    "additionalProperties": {"$ref": "#"},
    "definitions": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "default": {}
    },
    "properties": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "default": {}
    },
    "patternProperties": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "default": {}
    },
    "dependencies": {
      "type": "object",
      "additionalProperties": {
        "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/stringArray"}]
      }
    },
    "propertyNames": {"$ref": "#"},
    "const": {},
    "enum": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true
    },
    "type": {
      "anyOf": [
        {"$ref": "#/definitions/simpleTypes"},
        {
          "type": "array",
          "items": {"$ref": "#/definitions/simpleTypes"},
          "minItems": 1,
          "uniqueItems": true
        }
      ]
    },
    "format": {"type": "string"},
    "allOf": {"$ref": "#/definitions/schemaArray"},
    "anyOf": {"$ref": "#/definitions/schemaArray"},
    "oneOf": {"$ref": "#/definitions/schemaArray"},
    "not": {"$ref": "#"}
  },
  "default": {}
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://json-schema.org/draft-07/schema#",
  "title": "Core schema meta-schema",
  "definitions": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$ref": "#"}
    },
    "nonNegativeInteger": {
      "type": "integer",
      "minimum": 0
    },
    "nonNegativeIntegerDefault0": {
      "allOf": [{"$ref": "#/definitions/nonNegativeInteger"}, {"default": 0}]
    },
    "simpleTypes": {
      "enum": ["array", "boolean", "integer", "null", "number", "object", "string"]
    },
    "stringArray": {
      "type": "array",
      "items": {"type": "string"},
      "uniqueItems": true,
      "default": []
    }
  },
  "type": ["object", "boolean"],
  "properties": {
    "$id": {
      "type": "string",
      "format": "uri-reference"
    },
    "$schema": {
      "type": "string",
      "format": "uri"
    },
    "$ref": {
      "type": "string",
      "format": "uri-reference"
    },
    "$comment": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "default": true,
    "readOnly": {
      "type": "boolean",
      "default": false
    },
    "examples": {
      "type": "array",
      "items": true
    },
    "multipleOf": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "maximum": {
      "type": "number"
    },
    "exclusiveMaximum": {
      "type": "number"
    },
    "minimum": {
      "type": "number"
    },
    "exclusiveMinimum": {
      "type": "number"
    },
    "maxLength": {"$ref": "#/definitions/nonNegativeInteger"},
    "minLength": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "pattern": {
      "type": "string",
      "format": "regex"
    },
    "additionalItems": {"$ref": "#"},
    "items": {
      "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/schemaArray"}],
      "default": true
    },
    "maxItems": {"$ref": "#/definitions/nonNegativeInteger"},
    "minItems": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "uniqueItems": {
      "type": "boolean",
      "default": false
    },
    "contains": {"$ref": "#"},
    "maxProperties": {"$ref": "#/definitions/nonNegativeInteger"},
    "minProperties": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "required": {"$ref": "#/definitions/stringArray"},
    "additionalProperties": {"$ref": "#"},
    "definitions": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "default": {}
    },
    "properties": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "default": {}
    },
    "patternProperties": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "propertyNames": {"format": "regex"},
      "default": {}
    },
    "dependencies": {
      "type": "object",
      "additionalProperties": {
        "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/stringArray"}]
      }
    },
    "propertyNames": {"$ref": "#"},
    "const": true,
    "enum": {
      "type": "array",
      "items": true,
      "minItems": 1,
      "uniqueItems": true
    },
    "type": {
      "anyOf": [
        {"$ref": "#/definitions/simpleTypes"},
        {
          "type": "array",
          "items": {"$ref": "#/definitions/simpleTypes"},
          "minItems": 1,
          "uniqueItems": true
        }
      ]
    },
    "format": {"type": "string"},
    "contentMediaType": {"type": "string"},
    "contentEncoding": {"type": "string"},
    "if": {"$ref": "#"},
    "then": {"$ref": "#"},
    "else": {"$ref": "#"},
    "allOf": {"$ref": "#/definitions/schemaArray"},
    "anyOf": {"$ref": "#/definitions/schemaArray"},
    "oneOf": {"$ref": "#/definitions/schemaArray"},
    "not": {"$ref": "#"}
  },
  "default": true
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/json-schema-secure.json#",
  "title": "Meta-schema for the security assessment of JSON Schemas",
  "description": "If a JSON AnySchema fails validation against this meta-schema, it may be unsafe to validate untrusted data",
  "definitions": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$ref": "#"}
    }
  },
  "dependencies": {
    "patternProperties": {
      "description": "prevent slow validation of large property names",
      "required": ["propertyNames"],
      "properties": {
        "propertyNames": {
          "required": ["maxLength"]
        }
      }
    },
    "uniqueItems": {
      "description": "prevent slow validation of large non-scalar arrays",
      "if": {
        "properties": {
          "uniqueItems": {"const": true},
          "items": {
            "properties": {
              "type": {
                "anyOf": [
                  {
                    "enum": ["object", "array"]
                  },
                  {
                    "type": "array",
                    "contains": {"enum": ["object", "array"]}
                  }
                ]
              }
            }
          }
        }
      },
      "then": {
        "required": ["maxItems"]
      }
    },
    "pattern": {
      "description": "prevent slow pattern matching of large strings",
      "required": ["maxLength"]
    },
    "format": {
      "description": "prevent slow format validation of large strings",
      "required": ["maxLength"]
    }
  },
  "properties": {
    "additionalItems": {"$ref": "#"},
    "additionalProperties": {"$ref": "#"},
    "dependencies": {
      "additionalProperties": {
        "anyOf": [{"type": "array"}, {"$ref": "#"}]
      }
    },
    "items": {
      "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/schemaArray"}]
    },
    "definitions": {
      "additionalProperties": {"$ref": "#"}
    },
    "patternProperties": {
      "additionalProperties": {"$ref": "#"}
    },
    "properties": {
      "additionalProperties": {"$ref": "#"}
    },
    "if": {"$ref": "#"},
    "then": {"$ref": "#"},
    "else": {"$ref": "#"},
    "allOf": {"$ref": "#/definitions/schemaArray"},
    "anyOf": {"$ref": "#/definitions/schemaArray"},
    "oneOf": {"$ref": "#/definitions/schemaArray"},
    "not": {"$ref": "#"},
    "contains": {"$ref": "#"},
    "propertyNames": {"$ref": "#"}
  }
}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const shared = (root) => {
    const sch = {
        nullable: { type: "boolean" },
        metadata: {
            optionalProperties: {
                union: { elements: { ref: "schema" } },
            },
            additionalProperties: true,
        },
    };
    if (root)
        sch.definitions = { values: { ref: "schema" } };
    return sch;
};
const emptyForm = (root) => ({
    optionalProperties: shared(root),
});
const refForm = (root) => ({
    properties: {
        ref: { type: "string" },
    },
    optionalProperties: shared(root),
});
const typeForm = (root) => ({
    properties: {
        type: {
            enum: [
                "boolean",
                "timestamp",
                "string",
                "float32",
                "float64",
                "int8",
                "uint8",
                "int16",
                "uint16",
                "int32",
                "uint32",
            ],
        },
    },
    optionalProperties: shared(root),
});
const enumForm = (root) => ({
    properties: {
        enum: { elements: { type: "string" } },
    },
    optionalProperties: shared(root),
});
const elementsForm = (root) => ({
    properties: {
        elements: { ref: "schema" },
    },
    optionalProperties: shared(root),
});
const propertiesForm = (root) => ({
    properties: {
        properties: { values: { ref: "schema" } },
    },
    optionalProperties: {
        optionalProperties: { values: { ref: "schema" } },
        additionalProperties: { type: "boolean" },
        ...shared(root),
    },
});
const optionalPropertiesForm = (root) => ({
    properties: {
        optionalProperties: { values: { ref: "schema" } },
    },
    optionalProperties: {
        additionalProperties: { type: "boolean" },
        ...shared(root),
    },
});
const discriminatorForm = (root) => ({
    properties: {
        discriminator: { type: "string" },
        mapping: {
            values: {
                metadata: {
                    union: [propertiesForm(false), optionalPropertiesForm(false)],
                },
            },
        },
    },
    optionalProperties: shared(root),
});
const valuesForm = (root) => ({
    properties: {
        values: { ref: "schema" },
    },
    optionalProperties: shared(root),
});
const schema = (root) => ({
    metadata: {
        union: [
            emptyForm,
            refForm,
            typeForm,
            enumForm,
            elementsForm,
            propertiesForm,
            optionalPropertiesForm,
            discriminatorForm,
            valuesForm,
        ].map((s) => s(root)),
    },
});
const jtdMetaSchema = {
    definitions: {
        schema: schema(false),
    },
    ...schema(true),
};
exports.default = jtdMetaSchema;
//# sourceMappingURL=jtd-schema.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
// https://github.com/ajv-validator/ajv/issues/889
const equal = require("fast-deep-equal");
equal.code = 'require("ajv/dist/runtime/equal").default';
exports.default = equal;
//# sourceMappingURL=equal.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseJsonString = exports.parseJsonNumber = exports.parseJson = void 0;
const rxParseJson = /position\s(\d+)(?: \(line \d+ column \d+\))?$/;
function parseJson(s, pos) {
    let endPos;
    parseJson.message = undefined;
    let matches;
    if (pos)
        s = s.slice(pos);
    try {
        parseJson.position = pos + s.length;
        return JSON.parse(s);
    }
    catch (e) {
        matches = rxParseJson.exec(e.message);
        if (!matches) {
            parseJson.message = "unexpected end";
            return undefined;
        }
        endPos = +matches[1];
        const c = s[endPos];
        s = s.slice(0, endPos);
        parseJson.position = pos + endPos;
        try {
            return JSON.parse(s);
        }
        catch (e1) {
            parseJson.message = `unexpected token ${c}`;
            return undefined;
        }
    }
}
exports.parseJson = parseJson;
parseJson.message = undefined;
parseJson.position = 0;
parseJson.code = 'require("ajv/dist/runtime/parseJson").parseJson';
function parseJsonNumber(s, pos, maxDigits) {
    let numStr = "";
    let c;
    parseJsonNumber.message = undefined;
    if (s[pos] === "-") {
        numStr += "-";
        pos++;
    }
    if (s[pos] === "0") {
        numStr += "0";
        pos++;
    }
    else {
        if (!parseDigits(maxDigits)) {
            errorMessage();
            return undefined;
        }
    }
    if (maxDigits) {
        parseJsonNumber.position = pos;
        return +numStr;
    }
    if (s[pos] === ".") {
        numStr += ".";
        pos++;
        if (!parseDigits()) {
            errorMessage();
            return undefined;
        }
    }
    if (((c = s[pos]), c === "e" || c === "E")) {
        numStr += "e";
        pos++;
        if (((c = s[pos]), c === "+" || c === "-")) {
            numStr += c;
            pos++;
        }
        if (!parseDigits()) {
            errorMessage();
            return undefined;
        }
    }
    parseJsonNumber.position = pos;
    return +numStr;
    function parseDigits(maxLen) {
        let digit = false;
        while (((c = s[pos]), c >= "0" && c <= "9" && (maxLen === undefined || maxLen-- > 0))) {
            digit = true;
            numStr += c;
            pos++;
        }
        return digit;
    }
    function errorMessage() {
        parseJsonNumber.position = pos;
        parseJsonNumber.message = pos < s.length ? `unexpected token ${s[pos]}` : "unexpected end";
    }
}
exports.parseJsonNumber = parseJsonNumber;
parseJsonNumber.message = undefined;
parseJsonNumber.position = 0;
parseJsonNumber.code = 'require("ajv/dist/runtime/parseJson").parseJsonNumber';
const escapedChars = {
    b: "\b",
    f: "\f",
    n: "\n",
    r: "\r",
    t: "\t",
    '"': '"',
    "/": "/",
    "\\": "\\",
};
const CODE_A = "a".charCodeAt(0);
const CODE_0 = "0".charCodeAt(0);
function parseJsonString(s, pos) {
    let str = "";
    let c;
    parseJsonString.message = undefined;
    // eslint-disable-next-line no-constant-condition, @typescript-eslint/no-unnecessary-condition
    while (true) {
        c = s[pos++];
        if (c === '"')
            break;
        if (c === "\\") {
            c = s[pos];
            if (c in escapedChars) {
                str += escapedChars[c];
                pos++;
            }
            else if (c === "u") {
                pos++;
                let count = 4;
                let code = 0;
                while (count--) {
                    code <<= 4;
                    c = s[pos];
                    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
                    if (c === undefined) {
                        errorMessage("unexpected end");
                        return undefined;
                    }
                    c = c.toLowerCase();
                    if (c >= "a" && c <= "f") {
                        code += c.charCodeAt(0) - CODE_A + 10;
                    }
                    else if (c >= "0" && c <= "9") {
                        code += c.charCodeAt(0) - CODE_0;
                    }
                    else {
                        errorMessage(`unexpected token ${c}`);
                        return undefined;
                    }
                    pos++;
                }
                str += String.fromCharCode(code);
            }
            else {
                errorMessage(`unexpected token ${c}`);
                return undefined;
            }
            // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
        }
        else if (c === undefined) {
            errorMessage("unexpected end");
            return undefined;
        }
        else {
            if (c.charCodeAt(0) >= 0x20) {
                str += c;
            }
            else {
                errorMessage(`unexpected token ${c}`);
                return undefined;
            }
        }
    }
    parseJsonString.position = pos;
    return str;
    function errorMessage(msg) {
        parseJsonString.position = pos;
        parseJsonString.message = msg;
    }
}
exports.parseJsonString = parseJsonString;
parseJsonString.message = undefined;
parseJsonString.position = 0;
parseJsonString.code = 'require("ajv/dist/runtime/parseJson").parseJsonString';
//# sourceMappingURL=parseJson.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const rxEscapable = 
// eslint-disable-next-line no-control-regex, no-misleading-character-class
/[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
const escaped = {
    "\b": "\\b",
    "\t": "\\t",
    "\n": "\\n",
    "\f": "\\f",
    "\r": "\\r",
    '"': '\\"',
    "\\": "\\\\",
};
function quote(s) {
    rxEscapable.lastIndex = 0;
    return ('"' +
        (rxEscapable.test(s)
            ? s.replace(rxEscapable, (a) => {
                const c = escaped[a];
                return typeof c === "string"
                    ? c
                    : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
            })
            : s) +
        '"');
}
exports.default = quote;
quote.code = 'require("ajv/dist/runtime/quote").default';
//# sourceMappingURL=quote.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const re2 = require("re2");
re2.code = 'require("ajv/dist/runtime/re2").default';
exports.default = re2;
//# sourceMappingURL=re2.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const DT_SEPARATOR = /t|\s/i;
const DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/;
const TIME = /^(\d\d):(\d\d):(\d\d)(?:\.\d+)?(?:z|([+-]\d\d)(?::?(\d\d))?)$/i;
const DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
function validTimestamp(str, allowDate) {
    // http://tools.ietf.org/html/rfc3339#section-5.6
    const dt = str.split(DT_SEPARATOR);
    return ((dt.length === 2 && validDate(dt[0]) && validTime(dt[1])) ||
        (allowDate && dt.length === 1 && validDate(dt[0])));
}
exports.default = validTimestamp;
function validDate(str) {
    const matches = DATE.exec(str);
    if (!matches)
        return false;
    const y = +matches[1];
    const m = +matches[2];
    const d = +matches[3];
    return (m >= 1 &&
        m <= 12 &&
        d >= 1 &&
        (d <= DAYS[m] ||
            // leap year: https://tools.ietf.org/html/rfc3339#appendix-C
            (m === 2 && d === 29 && (y % 100 === 0 ? y % 400 === 0 : y % 4 === 0))));
}
function validTime(str) {
    const matches = TIME.exec(str);
    if (!matches)
        return false;
    const hr = +matches[1];
    const min = +matches[2];
    const sec = +matches[3];
    const tzH = +(matches[4] || 0);
    const tzM = +(matches[5] || 0);
    return ((hr <= 23 && min <= 59 && sec <= 59) ||
        // leap second
        (hr - tzH === 23 && min - tzM === 59 && sec === 60));
}
validTimestamp.code = 'require("ajv/dist/runtime/timestamp").default';
//# sourceMappingURL=timestamp.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
// https://mathiasbynens.be/notes/javascript-encoding
// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode
function ucs2length(str) {
    const len = str.length;
    let length = 0;
    let pos = 0;
    let value;
    while (pos < len) {
        length++;
        value = str.charCodeAt(pos++);
        if (value >= 0xd800 && value <= 0xdbff && pos < len) {
            // high surrogate, and there is a next character
            value = str.charCodeAt(pos);
            if ((value & 0xfc00) === 0xdc00)
                pos++; // low surrogate
        }
    }
    return length;
}
exports.default = ucs2length;
ucs2length.code = 'require("ajv/dist/runtime/ucs2length").default';
//# sourceMappingURL=ucs2length.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const uri = require("fast-uri");
uri.code = 'require("ajv/dist/runtime/uri").default';
exports.default = uri;
//# sourceMappingURL=uri.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class ValidationError extends Error {
    constructor(errors) {
        super("validation failed");
        this.errors = errors;
        this.ajv = this.validation = true;
    }
}
exports.default = ValidationError;
//# sourceMappingURL=validation_error.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const scope_1 = require("../compile/codegen/scope");
const code_1 = require("../compile/codegen/code");
function standaloneCode(ajv, refsOrFunc) {
    if (!ajv.opts.code.source) {
        throw new Error("moduleCode: ajv instance must have code.source option");
    }
    const { _n } = ajv.scope.opts;
    return typeof refsOrFunc == "function"
        ? funcExportCode(refsOrFunc.source)
        : refsOrFunc !== undefined
            ? multiExportsCode(refsOrFunc, getValidate)
            : multiExportsCode(ajv.schemas, (sch) => sch.meta ? undefined : ajv.compile(sch.schema));
    function getValidate(id) {
        const v = ajv.getSchema(id);
        if (!v)
            throw new Error(`moduleCode: no schema with id ${id}`);
        return v;
    }
    function funcExportCode(source) {
        const usedValues = {};
        const n = source === null || source === void 0 ? void 0 : source.validateName;
        const vCode = validateCode(usedValues, source);
        if (ajv.opts.code.esm) {
            // Always do named export as `validate` rather than the variable `n` which is `validateXX` for known export value
            return `"use strict";${_n}export const validate = ${n};${_n}export default ${n};${_n}${vCode}`;
        }
        return `"use strict";${_n}module.exports = ${n};${_n}module.exports.default = ${n};${_n}${vCode}`;
    }
    function multiExportsCode(schemas, getValidateFunc) {
        var _a;
        const usedValues = {};
        let code = (0, code_1._) `"use strict";`;
        for (const name in schemas) {
            const v = getValidateFunc(schemas[name]);
            if (v) {
                const vCode = validateCode(usedValues, v.source);
                const exportSyntax = ajv.opts.code.esm
                    ? (0, code_1._) `export const ${(0, code_1.getEsmExportName)(name)}`
                    : (0, code_1._) `exports${(0, code_1.getProperty)(name)}`;
                code = (0, code_1._) `${code}${_n}${exportSyntax} = ${(_a = v.source) === null || _a === void 0 ? void 0 : _a.validateName};${_n}${vCode}`;
            }
        }
        return `${code}`;
    }
    function validateCode(usedValues, s) {
        if (!s)
            throw new Error('moduleCode: function does not have "source" property');
        if (usedState(s.validateName) === scope_1.UsedValueState.Completed)
            return code_1.nil;
        setUsedState(s.validateName, scope_1.UsedValueState.Started);
        const scopeCode = ajv.scope.scopeCode(s.scopeValues, usedValues, refValidateCode);
        const code = new code_1._Code(`${scopeCode}${_n}${s.validateCode}`);
        return s.evaluated ? (0, code_1._) `${code}${s.validateName}.evaluated = ${s.evaluated};${_n}` : code;
        function refValidateCode(n) {
            var _a;
            const vRef = (_a = n.value) === null || _a === void 0 ? void 0 : _a.ref;
            if (n.prefix === "validate" && typeof vRef == "function") {
                const v = vRef;
                return validateCode(usedValues, v.source);
            }
            else if ((n.prefix === "root" || n.prefix === "wrapper") && typeof vRef == "object") {
                const { validate, validateName } = vRef;
                if (!validateName)
                    throw new Error("ajv internal error");
                const def = ajv.opts.code.es5 ? scope_1.varKinds.var : scope_1.varKinds.const;
                const wrapper = (0, code_1._) `${def} ${n} = {validate: ${validateName}};`;
                if (usedState(validateName) === scope_1.UsedValueState.Started)
                    return wrapper;
                const vCode = validateCode(usedValues, validate === null || validate === void 0 ? void 0 : validate.source);
                return (0, code_1._) `${wrapper}${_n}${vCode}`;
            }
            return undefined;
        }
        function usedState(name) {
            var _a;
            return (_a = usedValues[name.prefix]) === null || _a === void 0 ? void 0 : _a.get(name);
        }
        function setUsedState(name, state) {
            const { prefix } = name;
            const names = (usedValues[prefix] = usedValues[prefix] || new Map());
            names.set(name, state);
        }
    }
}
module.exports = exports = standaloneCode;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = standaloneCode;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("../core");
const _1 = require(".");
const requireFromString = require("require-from-string");
class AjvPack {
    constructor(ajv) {
        this.ajv = ajv;
    }
    validate(schemaKeyRef, data) {
        return core_1.default.prototype.validate.call(this, schemaKeyRef, data);
    }
    compile(schema, meta) {
        return this.getStandalone(this.ajv.compile(schema, meta));
    }
    getSchema(keyRef) {
        const v = this.ajv.getSchema(keyRef);
        if (!v)
            return undefined;
        return this.getStandalone(v);
    }
    getStandalone(v) {
        return requireFromString((0, _1.default)(this.ajv, v));
    }
    addSchema(...args) {
        this.ajv.addSchema.call(this.ajv, ...args);
        return this;
    }
    addKeyword(...args) {
        this.ajv.addKeyword.call(this.ajv, ...args);
        return this;
    }
}
exports.default = AjvPack;
//# sourceMappingURL=instance.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=json-schema.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=jtd-schema.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateAdditionalItems = void 0;
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const error = {
    message: ({ params: { len } }) => (0, codegen_1.str) `must NOT have more than ${len} items`,
    params: ({ params: { len } }) => (0, codegen_1._) `{limit: ${len}}`,
};
const def = {
    keyword: "additionalItems",
    type: "array",
    schemaType: ["boolean", "object"],
    before: "uniqueItems",
    error,
    code(cxt) {
        const { parentSchema, it } = cxt;
        const { items } = parentSchema;
        if (!Array.isArray(items)) {
            (0, util_1.checkStrictMode)(it, '"additionalItems" is ignored when "items" is not an array of schemas');
            return;
        }
        validateAdditionalItems(cxt, items);
    },
};
function validateAdditionalItems(cxt, items) {
    const { gen, schema, data, keyword, it } = cxt;
    it.items = true;
    const len = gen.const("len", (0, codegen_1._) `${data}.length`);
    if (schema === false) {
        cxt.setParams({ len: items.length });
        cxt.pass((0, codegen_1._) `${len} <= ${items.length}`);
    }
    else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) {
        const valid = gen.var("valid", (0, codegen_1._) `${len} <= ${items.length}`); // TODO var
        gen.if((0, codegen_1.not)(valid), () => validateItems(valid));
        cxt.ok(valid);
    }
    function validateItems(valid) {
        gen.forRange("i", items.length, len, (i) => {
            cxt.subschema({ keyword, dataProp: i, dataPropType: util_1.Type.Num }, valid);
            if (!it.allErrors)
                gen.if((0, codegen_1.not)(valid), () => gen.break());
        });
    }
}
exports.validateAdditionalItems = validateAdditionalItems;
exports.default = def;
//# sourceMappingURL=additionalItems.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const code_1 = require("../code");
const codegen_1 = require("../../compile/codegen");
const names_1 = require("../../compile/names");
const util_1 = require("../../compile/util");
const error = {
    message: "must NOT have additional properties",
    params: ({ params }) => (0, codegen_1._) `{additionalProperty: ${params.additionalProperty}}`,
};
const def = {
    keyword: "additionalProperties",
    type: ["object"],
    schemaType: ["boolean", "object"],
    allowUndefined: true,
    trackErrors: true,
    error,
    code(cxt) {
        const { gen, schema, parentSchema, data, errsCount, it } = cxt;
        /* istanbul ignore if */
        if (!errsCount)
            throw new Error("ajv implementation error");
        const { allErrors, opts } = it;
        it.props = true;
        if (opts.removeAdditional !== "all" && (0, util_1.alwaysValidSchema)(it, schema))
            return;
        const props = (0, code_1.allSchemaProperties)(parentSchema.properties);
        const patProps = (0, code_1.allSchemaProperties)(parentSchema.patternProperties);
        checkAdditionalProperties();
        cxt.ok((0, codegen_1._) `${errsCount} === ${names_1.default.errors}`);
        function checkAdditionalProperties() {
            gen.forIn("key", data, (key) => {
                if (!props.length && !patProps.length)
                    additionalPropertyCode(key);
                else
                    gen.if(isAdditional(key), () => additionalPropertyCode(key));
            });
        }
        function isAdditional(key) {
            let definedProp;
            if (props.length > 8) {
                // TODO maybe an option instead of hard-coded 8?
                const propsSchema = (0, util_1.schemaRefOrVal)(it, parentSchema.properties, "properties");
                definedProp = (0, code_1.isOwnProperty)(gen, propsSchema, key);
            }
            else if (props.length) {
                definedProp = (0, codegen_1.or)(...props.map((p) => (0, codegen_1._) `${key} === ${p}`));
            }
            else {
                definedProp = codegen_1.nil;
            }
            if (patProps.length) {
                definedProp = (0, codegen_1.or)(definedProp, ...patProps.map((p) => (0, codegen_1._) `${(0, code_1.usePattern)(cxt, p)}.test(${key})`));
            }
            return (0, codegen_1.not)(definedProp);
        }
        function deleteAdditional(key) {
            gen.code((0, codegen_1._) `delete ${data}[${key}]`);
        }
        function additionalPropertyCode(key) {
            if (opts.removeAdditional === "all" || (opts.removeAdditional && schema === false)) {
                deleteAdditional(key);
                return;
            }
            if (schema === false) {
                cxt.setParams({ additionalProperty: key });
                cxt.error();
                if (!allErrors)
                    gen.break();
                return;
            }
            if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) {
                const valid = gen.name("valid");
                if (opts.removeAdditional === "failing") {
                    applyAdditionalSchema(key, valid, false);
                    gen.if((0, codegen_1.not)(valid), () => {
                        cxt.reset();
                        deleteAdditional(key);
                    });
                }
                else {
                    applyAdditionalSchema(key, valid);
                    if (!allErrors)
                        gen.if((0, codegen_1.not)(valid), () => gen.break());
                }
            }
        }
        function applyAdditionalSchema(key, valid, errors) {
            const subschema = {
                keyword: "additionalProperties",
                dataProp: key,
                dataPropType: util_1.Type.Str,
            };
            if (errors === false) {
                Object.assign(subschema, {
                    compositeRule: true,
                    createErrors: false,
                    allErrors: false,
                });
            }
            cxt.subschema(subschema, valid);
        }
    },
};
exports.default = def;
//# sourceMappingURL=additionalProperties.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("../../compile/util");
const def = {
    keyword: "allOf",
    schemaType: "array",
    code(cxt) {
        const { gen, schema, it } = cxt;
        /* istanbul ignore if */
        if (!Array.isArray(schema))
            throw new Error("ajv implementation error");
        const valid = gen.name("valid");
        schema.forEach((sch, i) => {
            if ((0, util_1.alwaysValidSchema)(it, sch))
                return;
            const schCxt = cxt.subschema({ keyword: "allOf", schemaProp: i }, valid);
            cxt.ok(valid);
            cxt.mergeEvaluated(schCxt);
        });
    },
};
exports.default = def;
//# sourceMappingURL=allOf.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const code_1 = require("../code");
const def = {
    keyword: "anyOf",
    schemaType: "array",
    trackErrors: true,
    code: code_1.validateUnion,
    error: { message: "must match a schema in anyOf" },
};
exports.default = def;
//# sourceMappingURL=anyOf.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const error = {
    message: ({ params: { min, max } }) => max === undefined
        ? (0, codegen_1.str) `must contain at least ${min} valid item(s)`
        : (0, codegen_1.str) `must contain at least ${min} and no more than ${max} valid item(s)`,
    params: ({ params: { min, max } }) => max === undefined ? (0, codegen_1._) `{minContains: ${min}}` : (0, codegen_1._) `{minContains: ${min}, maxContains: ${max}}`,
};
const def = {
    keyword: "contains",
    type: "array",
    schemaType: ["object", "boolean"],
    before: "uniqueItems",
    trackErrors: true,
    error,
    code(cxt) {
        const { gen, schema, parentSchema, data, it } = cxt;
        let min;
        let max;
        const { minContains, maxContains } = parentSchema;
        if (it.opts.next) {
            min = minContains === undefined ? 1 : minContains;
            max = maxContains;
        }
        else {
            min = 1;
        }
        const len = gen.const("len", (0, codegen_1._) `${data}.length`);
        cxt.setParams({ min, max });
        if (max === undefined && min === 0) {
            (0, util_1.checkStrictMode)(it, `"minContains" == 0 without "maxContains": "contains" keyword ignored`);
            return;
        }
        if (max !== undefined && min > max) {
            (0, util_1.checkStrictMode)(it, `"minContains" > "maxContains" is always invalid`);
            cxt.fail();
            return;
        }
        if ((0, util_1.alwaysValidSchema)(it, schema)) {
            let cond = (0, codegen_1._) `${len} >= ${min}`;
            if (max !== undefined)
                cond = (0, codegen_1._) `${cond} && ${len} <= ${max}`;
            cxt.pass(cond);
            return;
        }
        it.items = true;
        const valid = gen.name("valid");
        if (max === undefined && min === 1) {
            validateItems(valid, () => gen.if(valid, () => gen.break()));
        }
        else if (min === 0) {
            gen.let(valid, true);
            if (max !== undefined)
                gen.if((0, codegen_1._) `${data}.length > 0`, validateItemsWithCount);
        }
        else {
            gen.let(valid, false);
            validateItemsWithCount();
        }
        cxt.result(valid, () => cxt.reset());
        function validateItemsWithCount() {
            const schValid = gen.name("_valid");
            const count = gen.let("count", 0);
            validateItems(schValid, () => gen.if(schValid, () => checkLimits(count)));
        }
        function validateItems(_valid, block) {
            gen.forRange("i", 0, len, (i) => {
                cxt.subschema({
                    keyword: "contains",
                    dataProp: i,
                    dataPropType: util_1.Type.Num,
                    compositeRule: true,
                }, _valid);
                block();
            });
        }
        function checkLimits(count) {
            gen.code((0, codegen_1._) `${count}++`);
            if (max === undefined) {
                gen.if((0, codegen_1._) `${count} >= ${min}`, () => gen.assign(valid, true).break());
            }
            else {
                gen.if((0, codegen_1._) `${count} > ${max}`, () => gen.assign(valid, false).break());
                if (min === 1)
                    gen.assign(valid, true);
                else
                    gen.if((0, codegen_1._) `${count} >= ${min}`, () => gen.assign(valid, true));
            }
        }
    },
};
exports.default = def;
//# sourceMappingURL=contains.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0;
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const code_1 = require("../code");
exports.error = {
    message: ({ params: { property, depsCount, deps } }) => {
        const property_ies = depsCount === 1 ? "property" : "properties";
        return (0, codegen_1.str) `must have ${property_ies} ${deps} when property ${property} is present`;
    },
    params: ({ params: { property, depsCount, deps, missingProperty } }) => (0, codegen_1._) `{property: ${property},
    missingProperty: ${missingProperty},
    depsCount: ${depsCount},
    deps: ${deps}}`, // TODO change to reference
};
const def = {
    keyword: "dependencies",
    type: "object",
    schemaType: "object",
    error: exports.error,
    code(cxt) {
        const [propDeps, schDeps] = splitDependencies(cxt);
        validatePropertyDeps(cxt, propDeps);
        validateSchemaDeps(cxt, schDeps);
    },
};
function splitDependencies({ schema }) {
    const propertyDeps = {};
    const schemaDeps = {};
    for (const key in schema) {
        if (key === "__proto__")
            continue;
        const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps;
        deps[key] = schema[key];
    }
    return [propertyDeps, schemaDeps];
}
function validatePropertyDeps(cxt, propertyDeps = cxt.schema) {
    const { gen, data, it } = cxt;
    if (Object.keys(propertyDeps).length === 0)
        return;
    const missing = gen.let("missing");
    for (const prop in propertyDeps) {
        const deps = propertyDeps[prop];
        if (deps.length === 0)
            continue;
        const hasProperty = (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties);
        cxt.setParams({
            property: prop,
            depsCount: deps.length,
            deps: deps.join(", "),
        });
        if (it.allErrors) {
            gen.if(hasProperty, () => {
                for (const depProp of deps) {
                    (0, code_1.checkReportMissingProp)(cxt, depProp);
                }
            });
        }
        else {
            gen.if((0, codegen_1._) `${hasProperty} && (${(0, code_1.checkMissingProp)(cxt, deps, missing)})`);
            (0, code_1.reportMissingProp)(cxt, missing);
            gen.else();
        }
    }
}
exports.validatePropertyDeps = validatePropertyDeps;
function validateSchemaDeps(cxt, schemaDeps = cxt.schema) {
    const { gen, data, keyword, it } = cxt;
    const valid = gen.name("valid");
    for (const prop in schemaDeps) {
        if ((0, util_1.alwaysValidSchema)(it, schemaDeps[prop]))
            continue;
        gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties), () => {
            const schCxt = cxt.subschema({ keyword, schemaProp: prop }, valid);
            cxt.mergeValidEvaluated(schCxt, valid);
        }, () => gen.var(valid, true) // TODO var
        );
        cxt.ok(valid);
    }
}
exports.validateSchemaDeps = validateSchemaDeps;
exports.default = def;
//# sourceMappingURL=dependencies.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const dependencies_1 = require("./dependencies");
const def = {
    keyword: "dependentSchemas",
    type: "object",
    schemaType: "object",
    code: (cxt) => (0, dependencies_1.validateSchemaDeps)(cxt),
};
exports.default = def;
//# sourceMappingURL=dependentSchemas.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const error = {
    message: ({ params }) => (0, codegen_1.str) `must match "${params.ifClause}" schema`,
    params: ({ params }) => (0, codegen_1._) `{failingKeyword: ${params.ifClause}}`,
};
const def = {
    keyword: "if",
    schemaType: ["object", "boolean"],
    trackErrors: true,
    error,
    code(cxt) {
        const { gen, parentSchema, it } = cxt;
        if (parentSchema.then === undefined && parentSchema.else === undefined) {
            (0, util_1.checkStrictMode)(it, '"if" without "then" and "else" is ignored');
        }
        const hasThen = hasSchema(it, "then");
        const hasElse = hasSchema(it, "else");
        if (!hasThen && !hasElse)
            return;
        const valid = gen.let("valid", true);
        const schValid = gen.name("_valid");
        validateIf();
        cxt.reset();
        if (hasThen && hasElse) {
            const ifClause = gen.let("ifClause");
            cxt.setParams({ ifClause });
            gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause));
        }
        else if (hasThen) {
            gen.if(schValid, validateClause("then"));
        }
        else {
            gen.if((0, codegen_1.not)(schValid), validateClause("else"));
        }
        cxt.pass(valid, () => cxt.error(true));
        function validateIf() {
            const schCxt = cxt.subschema({
                keyword: "if",
                compositeRule: true,
                createErrors: false,
                allErrors: false,
            }, schValid);
            cxt.mergeEvaluated(schCxt);
        }
        function validateClause(keyword, ifClause) {
            return () => {
                const schCxt = cxt.subschema({ keyword }, schValid);
                gen.assign(valid, schValid);
                cxt.mergeValidEvaluated(schCxt, valid);
                if (ifClause)
                    gen.assign(ifClause, (0, codegen_1._) `${keyword}`);
                else
                    cxt.setParams({ ifClause: keyword });
            };
        }
    },
};
function hasSchema(it, keyword) {
    const schema = it.schema[keyword];
    return schema !== undefined && !(0, util_1.alwaysValidSchema)(it, schema);
}
exports.default = def;
//# sourceMappingURL=if.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const additionalItems_1 = require("./additionalItems");
const prefixItems_1 = require("./prefixItems");
const items_1 = require("./items");
const items2020_1 = require("./items2020");
const contains_1 = require("./contains");
const dependencies_1 = require("./dependencies");
const propertyNames_1 = require("./propertyNames");
const additionalProperties_1 = require("./additionalProperties");
const properties_1 = require("./properties");
const patternProperties_1 = require("./patternProperties");
const not_1 = require("./not");
const anyOf_1 = require("./anyOf");
const oneOf_1 = require("./oneOf");
const allOf_1 = require("./allOf");
const if_1 = require("./if");
const thenElse_1 = require("./thenElse");
function getApplicator(draft2020 = false) {
    const applicator = [
        // any
        not_1.default,
        anyOf_1.default,
        oneOf_1.default,
        allOf_1.default,
        if_1.default,
        thenElse_1.default,
        // object
        propertyNames_1.default,
        additionalProperties_1.default,
        dependencies_1.default,
        properties_1.default,
        patternProperties_1.default,
    ];
    // array
    if (draft2020)
        applicator.push(prefixItems_1.default, items2020_1.default);
    else
        applicator.push(additionalItems_1.default, items_1.default);
    applicator.push(contains_1.default);
    return applicator;
}
exports.default = getApplicator;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateTuple = void 0;
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const code_1 = require("../code");
const def = {
    keyword: "items",
    type: "array",
    schemaType: ["object", "array", "boolean"],
    before: "uniqueItems",
    code(cxt) {
        const { schema, it } = cxt;
        if (Array.isArray(schema))
            return validateTuple(cxt, "additionalItems", schema);
        it.items = true;
        if ((0, util_1.alwaysValidSchema)(it, schema))
            return;
        cxt.ok((0, code_1.validateArray)(cxt));
    },
};
function validateTuple(cxt, extraItems, schArr = cxt.schema) {
    const { gen, parentSchema, data, keyword, it } = cxt;
    checkStrictTuple(parentSchema);
    if (it.opts.unevaluated && schArr.length && it.items !== true) {
        it.items = util_1.mergeEvaluated.items(gen, schArr.length, it.items);
    }
    const valid = gen.name("valid");
    const len = gen.const("len", (0, codegen_1._) `${data}.length`);
    schArr.forEach((sch, i) => {
        if ((0, util_1.alwaysValidSchema)(it, sch))
            return;
        gen.if((0, codegen_1._) `${len} > ${i}`, () => cxt.subschema({
            keyword,
            schemaProp: i,
            dataProp: i,
        }, valid));
        cxt.ok(valid);
    });
    function checkStrictTuple(sch) {
        const { opts, errSchemaPath } = it;
        const l = schArr.length;
        const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false);
        if (opts.strictTuples && !fullTuple) {
            const msg = `"${keyword}" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`;
            (0, util_1.checkStrictMode)(it, msg, opts.strictTuples);
        }
    }
}
exports.validateTuple = validateTuple;
exports.default = def;
//# sourceMappingURL=items.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const code_1 = require("../code");
const additionalItems_1 = require("./additionalItems");
const error = {
    message: ({ params: { len } }) => (0, codegen_1.str) `must NOT have more than ${len} items`,
    params: ({ params: { len } }) => (0, codegen_1._) `{limit: ${len}}`,
};
const def = {
    keyword: "items",
    type: "array",
    schemaType: ["object", "boolean"],
    before: "uniqueItems",
    error,
    code(cxt) {
        const { schema, parentSchema, it } = cxt;
        const { prefixItems } = parentSchema;
        it.items = true;
        if ((0, util_1.alwaysValidSchema)(it, schema))
            return;
        if (prefixItems)
            (0, additionalItems_1.validateAdditionalItems)(cxt, prefixItems);
        else
            cxt.ok((0, code_1.validateArray)(cxt));
    },
};
exports.default = def;
//# sourceMappingURL=items2020.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("../../compile/util");
const def = {
    keyword: "not",
    schemaType: ["object", "boolean"],
    trackErrors: true,
    code(cxt) {
        const { gen, schema, it } = cxt;
        if ((0, util_1.alwaysValidSchema)(it, schema)) {
            cxt.fail();
            return;
        }
        const valid = gen.name("valid");
        cxt.subschema({
            keyword: "not",
            compositeRule: true,
            createErrors: false,
            allErrors: false,
        }, valid);
        cxt.failResult(valid, () => cxt.reset(), () => cxt.error());
    },
    error: { message: "must NOT be valid" },
};
exports.default = def;
//# sourceMappingURL=not.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const error = {
    message: "must match exactly one schema in oneOf",
    params: ({ params }) => (0, codegen_1._) `{passingSchemas: ${params.passing}}`,
};
const def = {
    keyword: "oneOf",
    schemaType: "array",
    trackErrors: true,
    error,
    code(cxt) {
        const { gen, schema, parentSchema, it } = cxt;
        /* istanbul ignore if */
        if (!Array.isArray(schema))
            throw new Error("ajv implementation error");
        if (it.opts.discriminator && parentSchema.discriminator)
            return;
        const schArr = schema;
        const valid = gen.let("valid", false);
        const passing = gen.let("passing", null);
        const schValid = gen.name("_valid");
        cxt.setParams({ passing });
        // TODO possibly fail straight away (with warning or exception) if there are two empty always valid schemas
        gen.block(validateOneOf);
        cxt.result(valid, () => cxt.reset(), () => cxt.error(true));
        function validateOneOf() {
            schArr.forEach((sch, i) => {
                let schCxt;
                if ((0, util_1.alwaysValidSchema)(it, sch)) {
                    gen.var(schValid, true);
                }
                else {
                    schCxt = cxt.subschema({
                        keyword: "oneOf",
                        schemaProp: i,
                        compositeRule: true,
                    }, schValid);
                }
                if (i > 0) {
                    gen
                        .if((0, codegen_1._) `${schValid} && ${valid}`)
                        .assign(valid, false)
                        .assign(passing, (0, codegen_1._) `[${passing}, ${i}]`)
                        .else();
                }
                gen.if(schValid, () => {
                    gen.assign(valid, true);
                    gen.assign(passing, i);
                    if (schCxt)
                        cxt.mergeEvaluated(schCxt, codegen_1.Name);
                });
            });
        }
    },
};
exports.default = def;
//# sourceMappingURL=oneOf.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const code_1 = require("../code");
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const util_2 = require("../../compile/util");
const def = {
    keyword: "patternProperties",
    type: "object",
    schemaType: "object",
    code(cxt) {
        const { gen, schema, data, parentSchema, it } = cxt;
        const { opts } = it;
        const patterns = (0, code_1.allSchemaProperties)(schema);
        const alwaysValidPatterns = patterns.filter((p) => (0, util_1.alwaysValidSchema)(it, schema[p]));
        if (patterns.length === 0 ||
            (alwaysValidPatterns.length === patterns.length &&
                (!it.opts.unevaluated || it.props === true))) {
            return;
        }
        const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties;
        const valid = gen.name("valid");
        if (it.props !== true && !(it.props instanceof codegen_1.Name)) {
            it.props = (0, util_2.evaluatedPropsToName)(gen, it.props);
        }
        const { props } = it;
        validatePatternProperties();
        function validatePatternProperties() {
            for (const pat of patterns) {
                if (checkProperties)
                    checkMatchingProperties(pat);
                if (it.allErrors) {
                    validateProperties(pat);
                }
                else {
                    gen.var(valid, true); // TODO var
                    validateProperties(pat);
                    gen.if(valid);
                }
            }
        }
        function checkMatchingProperties(pat) {
            for (const prop in checkProperties) {
                if (new RegExp(pat).test(prop)) {
                    (0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`);
                }
            }
        }
        function validateProperties(pat) {
            gen.forIn("key", data, (key) => {
                gen.if((0, codegen_1._) `${(0, code_1.usePattern)(cxt, pat)}.test(${key})`, () => {
                    const alwaysValid = alwaysValidPatterns.includes(pat);
                    if (!alwaysValid) {
                        cxt.subschema({
                            keyword: "patternProperties",
                            schemaProp: pat,
                            dataProp: key,
                            dataPropType: util_2.Type.Str,
                        }, valid);
                    }
                    if (it.opts.unevaluated && props !== true) {
                        gen.assign((0, codegen_1._) `${props}[${key}]`, true);
                    }
                    else if (!alwaysValid && !it.allErrors) {
                        // can short-circuit if `unevaluatedProperties` is not supported (opts.next === false)
                        // or if all properties were evaluated (props === true)
                        gen.if((0, codegen_1.not)(valid), () => gen.break());
                    }
                });
            });
        }
    },
};
exports.default = def;
//# sourceMappingURL=patternProperties.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const items_1 = require("./items");
const def = {
    keyword: "prefixItems",
    type: "array",
    schemaType: ["array"],
    before: "uniqueItems",
    code: (cxt) => (0, items_1.validateTuple)(cxt, "items"),
};
exports.default = def;
//# sourceMappingURL=prefixItems.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const validate_1 = require("../../compile/validate");
const code_1 = require("../code");
const util_1 = require("../../compile/util");
const additionalProperties_1 = require("./additionalProperties");
const def = {
    keyword: "properties",
    type: "object",
    schemaType: "object",
    code(cxt) {
        const { gen, schema, parentSchema, data, it } = cxt;
        if (it.opts.removeAdditional === "all" && parentSchema.additionalProperties === undefined) {
            additionalProperties_1.default.code(new validate_1.KeywordCxt(it, additionalProperties_1.default, "additionalProperties"));
        }
        const allProps = (0, code_1.allSchemaProperties)(schema);
        for (const prop of allProps) {
            it.definedProperties.add(prop);
        }
        if (it.opts.unevaluated && allProps.length && it.props !== true) {
            it.props = util_1.mergeEvaluated.props(gen, (0, util_1.toHash)(allProps), it.props);
        }
        const properties = allProps.filter((p) => !(0, util_1.alwaysValidSchema)(it, schema[p]));
        if (properties.length === 0)
            return;
        const valid = gen.name("valid");
        for (const prop of properties) {
            if (hasDefault(prop)) {
                applyPropertySchema(prop);
            }
            else {
                gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties));
                applyPropertySchema(prop);
                if (!it.allErrors)
                    gen.else().var(valid, true);
                gen.endIf();
            }
            cxt.it.definedProperties.add(prop);
            cxt.ok(valid);
        }
        function hasDefault(prop) {
            return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== undefined;
        }
        function applyPropertySchema(prop) {
            cxt.subschema({
                keyword: "properties",
                schemaProp: prop,
                dataProp: prop,
            }, valid);
        }
    },
};
exports.default = def;
//# sourceMappingURL=properties.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const error = {
    message: "property name must be valid",
    params: ({ params }) => (0, codegen_1._) `{propertyName: ${params.propertyName}}`,
};
const def = {
    keyword: "propertyNames",
    type: "object",
    schemaType: ["object", "boolean"],
    error,
    code(cxt) {
        const { gen, schema, data, it } = cxt;
        if ((0, util_1.alwaysValidSchema)(it, schema))
            return;
        const valid = gen.name("valid");
        gen.forIn("key", data, (key) => {
            cxt.setParams({ propertyName: key });
            cxt.subschema({
                keyword: "propertyNames",
                data: key,
                dataTypes: ["string"],
                propertyName: key,
                compositeRule: true,
            }, valid);
            gen.if((0, codegen_1.not)(valid), () => {
                cxt.error(true);
                if (!it.allErrors)
                    gen.break();
            });
        });
        cxt.ok(valid);
    },
};
exports.default = def;
//# sourceMappingURL=propertyNames.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("../../compile/util");
const def = {
    keyword: ["then", "else"],
    schemaType: ["object", "boolean"],
    code({ keyword, parentSchema, it }) {
        if (parentSchema.if === undefined)
            (0, util_1.checkStrictMode)(it, `"${keyword}" without "if" is ignored`);
    },
};
exports.default = def;
//# sourceMappingURL=thenElse.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0;
const codegen_1 = require("../compile/codegen");
const util_1 = require("../compile/util");
const names_1 = require("../compile/names");
const util_2 = require("../compile/util");
function checkReportMissingProp(cxt, prop) {
    const { gen, data, it } = cxt;
    gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => {
        cxt.setParams({ missingProperty: (0, codegen_1._) `${prop}` }, true);
        cxt.error();
    });
}
exports.checkReportMissingProp = checkReportMissingProp;
function checkMissingProp({ gen, data, it: { opts } }, properties, missing) {
    return (0, codegen_1.or)(...properties.map((prop) => (0, codegen_1.and)(noPropertyInData(gen, data, prop, opts.ownProperties), (0, codegen_1._) `${missing} = ${prop}`)));
}
exports.checkMissingProp = checkMissingProp;
function reportMissingProp(cxt, missing) {
    cxt.setParams({ missingProperty: missing }, true);
    cxt.error();
}
exports.reportMissingProp = reportMissingProp;
function hasPropFunc(gen) {
    return gen.scopeValue("func", {
        // eslint-disable-next-line @typescript-eslint/unbound-method
        ref: Object.prototype.hasOwnProperty,
        code: (0, codegen_1._) `Object.prototype.hasOwnProperty`,
    });
}
exports.hasPropFunc = hasPropFunc;
function isOwnProperty(gen, data, property) {
    return (0, codegen_1._) `${hasPropFunc(gen)}.call(${data}, ${property})`;
}
exports.isOwnProperty = isOwnProperty;
function propertyInData(gen, data, property, ownProperties) {
    const cond = (0, codegen_1._) `${data}${(0, codegen_1.getProperty)(property)} !== undefined`;
    return ownProperties ? (0, codegen_1._) `${cond} && ${isOwnProperty(gen, data, property)}` : cond;
}
exports.propertyInData = propertyInData;
function noPropertyInData(gen, data, property, ownProperties) {
    const cond = (0, codegen_1._) `${data}${(0, codegen_1.getProperty)(property)} === undefined`;
    return ownProperties ? (0, codegen_1.or)(cond, (0, codegen_1.not)(isOwnProperty(gen, data, property))) : cond;
}
exports.noPropertyInData = noPropertyInData;
function allSchemaProperties(schemaMap) {
    return schemaMap ? Object.keys(schemaMap).filter((p) => p !== "__proto__") : [];
}
exports.allSchemaProperties = allSchemaProperties;
function schemaProperties(it, schemaMap) {
    return allSchemaProperties(schemaMap).filter((p) => !(0, util_1.alwaysValidSchema)(it, schemaMap[p]));
}
exports.schemaProperties = schemaProperties;
function callValidateCode({ schemaCode, data, it: { gen, topSchemaRef, schemaPath, errorPath }, it }, func, context, passSchema) {
    const dataAndSchema = passSchema ? (0, codegen_1._) `${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data;
    const valCxt = [
        [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, errorPath)],
        [names_1.default.parentData, it.parentData],
        [names_1.default.parentDataProperty, it.parentDataProperty],
        [names_1.default.rootData, names_1.default.rootData],
    ];
    if (it.opts.dynamicRef)
        valCxt.push([names_1.default.dynamicAnchors, names_1.default.dynamicAnchors]);
    const args = (0, codegen_1._) `${dataAndSchema}, ${gen.object(...valCxt)}`;
    return context !== codegen_1.nil ? (0, codegen_1._) `${func}.call(${context}, ${args})` : (0, codegen_1._) `${func}(${args})`;
}
exports.callValidateCode = callValidateCode;
const newRegExp = (0, codegen_1._) `new RegExp`;
function usePattern({ gen, it: { opts } }, pattern) {
    const u = opts.unicodeRegExp ? "u" : "";
    const { regExp } = opts.code;
    const rx = regExp(pattern, u);
    return gen.scopeValue("pattern", {
        key: rx.toString(),
        ref: rx,
        code: (0, codegen_1._) `${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})`,
    });
}
exports.usePattern = usePattern;
function validateArray(cxt) {
    const { gen, data, keyword, it } = cxt;
    const valid = gen.name("valid");
    if (it.allErrors) {
        const validArr = gen.let("valid", true);
        validateItems(() => gen.assign(validArr, false));
        return validArr;
    }
    gen.var(valid, true);
    validateItems(() => gen.break());
    return valid;
    function validateItems(notValid) {
        const len = gen.const("len", (0, codegen_1._) `${data}.length`);
        gen.forRange("i", 0, len, (i) => {
            cxt.subschema({
                keyword,
                dataProp: i,
                dataPropType: util_1.Type.Num,
            }, valid);
            gen.if((0, codegen_1.not)(valid), notValid);
        });
    }
}
exports.validateArray = validateArray;
function validateUnion(cxt) {
    const { gen, schema, keyword, it } = cxt;
    /* istanbul ignore if */
    if (!Array.isArray(schema))
        throw new Error("ajv implementation error");
    const alwaysValid = schema.some((sch) => (0, util_1.alwaysValidSchema)(it, sch));
    if (alwaysValid && !it.opts.unevaluated)
        return;
    const valid = gen.let("valid", false);
    const schValid = gen.name("_valid");
    gen.block(() => schema.forEach((_sch, i) => {
        const schCxt = cxt.subschema({
            keyword,
            schemaProp: i,
            compositeRule: true,
        }, schValid);
        gen.assign(valid, (0, codegen_1._) `${valid} || ${schValid}`);
        const merged = cxt.mergeValidEvaluated(schCxt, schValid);
        // can short-circuit if `unevaluatedProperties/Items` not supported (opts.unevaluated !== true)
        // or if all properties and items were evaluated (it.props === true && it.items === true)
        if (!merged)
            gen.if((0, codegen_1.not)(valid));
    }));
    cxt.result(valid, () => cxt.reset(), () => cxt.error(true));
}
exports.validateUnion = validateUnion;
//# sourceMappingURL=code.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const def = {
    keyword: "id",
    code() {
        throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID');
    },
};
exports.default = def;
//# sourceMappingURL=id.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const id_1 = require("./id");
const ref_1 = require("./ref");
const core = [
    "$schema",
    "$id",
    "$defs",
    "$vocabulary",
    { keyword: "$comment" },
    "definitions",
    id_1.default,
    ref_1.default,
];
exports.default = core;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.callRef = exports.getValidate = void 0;
const ref_error_1 = require("../../compile/ref_error");
const code_1 = require("../code");
const codegen_1 = require("../../compile/codegen");
const names_1 = require("../../compile/names");
const compile_1 = require("../../compile");
const util_1 = require("../../compile/util");
const def = {
    keyword: "$ref",
    schemaType: "string",
    code(cxt) {
        const { gen, schema: $ref, it } = cxt;
        const { baseId, schemaEnv: env, validateName, opts, self } = it;
        const { root } = env;
        if (($ref === "#" || $ref === "#/") && baseId === root.baseId)
            return callRootRef();
        const schOrEnv = compile_1.resolveRef.call(self, root, baseId, $ref);
        if (schOrEnv === undefined)
            throw new ref_error_1.default(it.opts.uriResolver, baseId, $ref);
        if (schOrEnv instanceof compile_1.SchemaEnv)
            return callValidate(schOrEnv);
        return inlineRefSchema(schOrEnv);
        function callRootRef() {
            if (env === root)
                return callRef(cxt, validateName, env, env.$async);
            const rootName = gen.scopeValue("root", { ref: root });
            return callRef(cxt, (0, codegen_1._) `${rootName}.validate`, root, root.$async);
        }
        function callValidate(sch) {
            const v = getValidate(cxt, sch);
            callRef(cxt, v, sch, sch.$async);
        }
        function inlineRefSchema(sch) {
            const schName = gen.scopeValue("schema", opts.code.source === true ? { ref: sch, code: (0, codegen_1.stringify)(sch) } : { ref: sch });
            const valid = gen.name("valid");
            const schCxt = cxt.subschema({
                schema: sch,
                dataTypes: [],
                schemaPath: codegen_1.nil,
                topSchemaRef: schName,
                errSchemaPath: $ref,
            }, valid);
            cxt.mergeEvaluated(schCxt);
            cxt.ok(valid);
        }
    },
};
function getValidate(cxt, sch) {
    const { gen } = cxt;
    return sch.validate
        ? gen.scopeValue("validate", { ref: sch.validate })
        : (0, codegen_1._) `${gen.scopeValue("wrapper", { ref: sch })}.validate`;
}
exports.getValidate = getValidate;
function callRef(cxt, v, sch, $async) {
    const { gen, it } = cxt;
    const { allErrors, schemaEnv: env, opts } = it;
    const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil;
    if ($async)
        callAsyncRef();
    else
        callSyncRef();
    function callAsyncRef() {
        if (!env.$async)
            throw new Error("async schema referenced by sync schema");
        const valid = gen.let("valid");
        gen.try(() => {
            gen.code((0, codegen_1._) `await ${(0, code_1.callValidateCode)(cxt, v, passCxt)}`);
            addEvaluatedFrom(v); // TODO will not work with async, it has to be returned with the result
            if (!allErrors)
                gen.assign(valid, true);
        }, (e) => {
            gen.if((0, codegen_1._) `!(${e} instanceof ${it.ValidationError})`, () => gen.throw(e));
            addErrorsFrom(e);
            if (!allErrors)
                gen.assign(valid, false);
        });
        cxt.ok(valid);
    }
    function callSyncRef() {
        cxt.result((0, code_1.callValidateCode)(cxt, v, passCxt), () => addEvaluatedFrom(v), () => addErrorsFrom(v));
    }
    function addErrorsFrom(source) {
        const errs = (0, codegen_1._) `${source}.errors`;
        gen.assign(names_1.default.vErrors, (0, codegen_1._) `${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`); // TODO tagged
        gen.assign(names_1.default.errors, (0, codegen_1._) `${names_1.default.vErrors}.length`);
    }
    function addEvaluatedFrom(source) {
        var _a;
        if (!it.opts.unevaluated)
            return;
        const schEvaluated = (_a = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a === void 0 ? void 0 : _a.evaluated;
        // TODO refactor
        if (it.props !== true) {
            if (schEvaluated && !schEvaluated.dynamicProps) {
                if (schEvaluated.props !== undefined) {
                    it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props);
                }
            }
            else {
                const props = gen.var("props", (0, codegen_1._) `${source}.evaluated.props`);
                it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name);
            }
        }
        if (it.items !== true) {
            if (schEvaluated && !schEvaluated.dynamicItems) {
                if (schEvaluated.items !== undefined) {
                    it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items);
                }
            }
            else {
                const items = gen.var("items", (0, codegen_1._) `${source}.evaluated.items`);
                it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name);
            }
        }
    }
}
exports.callRef = callRef;
exports.default = def;
//# sourceMappingURL=ref.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const types_1 = require("../discriminator/types");
const compile_1 = require("../../compile");
const ref_error_1 = require("../../compile/ref_error");
const util_1 = require("../../compile/util");
const error = {
    message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag
        ? `tag "${tagName}" must be string`
        : `value of tag "${tagName}" must be in oneOf`,
    params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._) `{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}`,
};
const def = {
    keyword: "discriminator",
    type: "object",
    schemaType: "object",
    error,
    code(cxt) {
        const { gen, data, schema, parentSchema, it } = cxt;
        const { oneOf } = parentSchema;
        if (!it.opts.discriminator) {
            throw new Error("discriminator: requires discriminator option");
        }
        const tagName = schema.propertyName;
        if (typeof tagName != "string")
            throw new Error("discriminator: requires propertyName");
        if (schema.mapping)
            throw new Error("discriminator: mapping is not supported");
        if (!oneOf)
            throw new Error("discriminator: requires oneOf keyword");
        const valid = gen.let("valid", false);
        const tag = gen.const("tag", (0, codegen_1._) `${data}${(0, codegen_1.getProperty)(tagName)}`);
        gen.if((0, codegen_1._) `typeof ${tag} == "string"`, () => validateMapping(), () => cxt.error(false, { discrError: types_1.DiscrError.Tag, tag, tagName }));
        cxt.ok(valid);
        function validateMapping() {
            const mapping = getMapping();
            gen.if(false);
            for (const tagValue in mapping) {
                gen.elseIf((0, codegen_1._) `${tag} === ${tagValue}`);
                gen.assign(valid, applyTagSchema(mapping[tagValue]));
            }
            gen.else();
            cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag, tagName });
            gen.endIf();
        }
        function applyTagSchema(schemaProp) {
            const _valid = gen.name("valid");
            const schCxt = cxt.subschema({ keyword: "oneOf", schemaProp }, _valid);
            cxt.mergeEvaluated(schCxt, codegen_1.Name);
            return _valid;
        }
        function getMapping() {
            var _a;
            const oneOfMapping = {};
            const topRequired = hasRequired(parentSchema);
            let tagRequired = true;
            for (let i = 0; i < oneOf.length; i++) {
                let sch = oneOf[i];
                if ((sch === null || sch === void 0 ? void 0 : sch.$ref) && !(0, util_1.schemaHasRulesButRef)(sch, it.self.RULES)) {
                    const ref = sch.$ref;
                    sch = compile_1.resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref);
                    if (sch instanceof compile_1.SchemaEnv)
                        sch = sch.schema;
                    if (sch === undefined)
                        throw new ref_error_1.default(it.opts.uriResolver, it.baseId, ref);
                }
                const propSch = (_a = sch === null || sch === void 0 ? void 0 : sch.properties) === null || _a === void 0 ? void 0 : _a[tagName];
                if (typeof propSch != "object") {
                    throw new Error(`discriminator: oneOf subschemas (or referenced schemas) must have "properties/${tagName}"`);
                }
                tagRequired = tagRequired && (topRequired || hasRequired(sch));
                addMappings(propSch, i);
            }
            if (!tagRequired)
                throw new Error(`discriminator: "${tagName}" must be required`);
            return oneOfMapping;
            function hasRequired({ required }) {
                return Array.isArray(required) && required.includes(tagName);
            }
            function addMappings(sch, i) {
                if (sch.const) {
                    addMapping(sch.const, i);
                }
                else if (sch.enum) {
                    for (const tagValue of sch.enum) {
                        addMapping(tagValue, i);
                    }
                }
                else {
                    throw new Error(`discriminator: "properties/${tagName}" must have "const" or "enum"`);
                }
            }
            function addMapping(tagValue, i) {
                if (typeof tagValue != "string" || tagValue in oneOfMapping) {
                    throw new Error(`discriminator: "${tagName}" values must be unique strings`);
                }
                oneOfMapping[tagValue] = i;
            }
        }
    },
};
exports.default = def;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DiscrError = void 0;
var DiscrError;
(function (DiscrError) {
    DiscrError["Tag"] = "tag";
    DiscrError["Mapping"] = "mapping";
})(DiscrError || (exports.DiscrError = DiscrError = {}));
//# sourceMappingURL=types.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("./core");
const validation_1 = require("./validation");
const applicator_1 = require("./applicator");
const dynamic_1 = require("./dynamic");
const next_1 = require("./next");
const unevaluated_1 = require("./unevaluated");
const format_1 = require("./format");
const metadata_1 = require("./metadata");
const draft2020Vocabularies = [
    dynamic_1.default,
    core_1.default,
    validation_1.default,
    (0, applicator_1.default)(true),
    format_1.default,
    metadata_1.metadataVocabulary,
    metadata_1.contentVocabulary,
    next_1.default,
    unevaluated_1.default,
];
exports.default = draft2020Vocabularies;
//# sourceMappingURL=draft2020.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("./core");
const validation_1 = require("./validation");
const applicator_1 = require("./applicator");
const format_1 = require("./format");
const metadata_1 = require("./metadata");
const draft7Vocabularies = [
    core_1.default,
    validation_1.default,
    (0, applicator_1.default)(),
    format_1.default,
    metadata_1.metadataVocabulary,
    metadata_1.contentVocabulary,
];
exports.default = draft7Vocabularies;
//# sourceMappingURL=draft7.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.dynamicAnchor = void 0;
const codegen_1 = require("../../compile/codegen");
const names_1 = require("../../compile/names");
const compile_1 = require("../../compile");
const ref_1 = require("../core/ref");
const def = {
    keyword: "$dynamicAnchor",
    schemaType: "string",
    code: (cxt) => dynamicAnchor(cxt, cxt.schema),
};
function dynamicAnchor(cxt, anchor) {
    const { gen, it } = cxt;
    it.schemaEnv.root.dynamicAnchors[anchor] = true;
    const v = (0, codegen_1._) `${names_1.default.dynamicAnchors}${(0, codegen_1.getProperty)(anchor)}`;
    const validate = it.errSchemaPath === "#" ? it.validateName : _getValidate(cxt);
    gen.if((0, codegen_1._) `!${v}`, () => gen.assign(v, validate));
}
exports.dynamicAnchor = dynamicAnchor;
function _getValidate(cxt) {
    const { schemaEnv, schema, self } = cxt.it;
    const { root, baseId, localRefs, meta } = schemaEnv.root;
    const { schemaId } = self.opts;
    const sch = new compile_1.SchemaEnv({ schema, schemaId, root, baseId, localRefs, meta });
    compile_1.compileSchema.call(self, sch);
    return (0, ref_1.getValidate)(cxt, sch);
}
exports.default = def;
//# sourceMappingURL=dynamicAnchor.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.dynamicRef = void 0;
const codegen_1 = require("../../compile/codegen");
const names_1 = require("../../compile/names");
const ref_1 = require("../core/ref");
const def = {
    keyword: "$dynamicRef",
    schemaType: "string",
    code: (cxt) => dynamicRef(cxt, cxt.schema),
};
function dynamicRef(cxt, ref) {
    const { gen, keyword, it } = cxt;
    if (ref[0] !== "#")
        throw new Error(`"${keyword}" only supports hash fragment reference`);
    const anchor = ref.slice(1);
    if (it.allErrors) {
        _dynamicRef();
    }
    else {
        const valid = gen.let("valid", false);
        _dynamicRef(valid);
        cxt.ok(valid);
    }
    function _dynamicRef(valid) {
        // TODO the assumption here is that `recursiveRef: #` always points to the root
        // of the schema object, which is not correct, because there may be $id that
        // makes # point to it, and the target schema may not contain dynamic/recursiveAnchor.
        // Because of that 2 tests in recursiveRef.json fail.
        // This is a similar problem to #815 (`$id` doesn't alter resolution scope for `{ "$ref": "#" }`).
        // (This problem is not tested in JSON-Schema-Test-Suite)
        if (it.schemaEnv.root.dynamicAnchors[anchor]) {
            const v = gen.let("_v", (0, codegen_1._) `${names_1.default.dynamicAnchors}${(0, codegen_1.getProperty)(anchor)}`);
            gen.if(v, _callRef(v, valid), _callRef(it.validateName, valid));
        }
        else {
            _callRef(it.validateName, valid)();
        }
    }
    function _callRef(validate, valid) {
        return valid
            ? () => gen.block(() => {
                (0, ref_1.callRef)(cxt, validate);
                gen.let(valid, true);
            })
            : () => (0, ref_1.callRef)(cxt, validate);
    }
}
exports.dynamicRef = dynamicRef;
exports.default = def;
//# sourceMappingURL=dynamicRef.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const dynamicAnchor_1 = require("./dynamicAnchor");
const dynamicRef_1 = require("./dynamicRef");
const recursiveAnchor_1 = require("./recursiveAnchor");
const recursiveRef_1 = require("./recursiveRef");
const dynamic = [dynamicAnchor_1.default, dynamicRef_1.default, recursiveAnchor_1.default, recursiveRef_1.default];
exports.default = dynamic;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const dynamicAnchor_1 = require("./dynamicAnchor");
const util_1 = require("../../compile/util");
const def = {
    keyword: "$recursiveAnchor",
    schemaType: "boolean",
    code(cxt) {
        if (cxt.schema)
            (0, dynamicAnchor_1.dynamicAnchor)(cxt, "");
        else
            (0, util_1.checkStrictMode)(cxt.it, "$recursiveAnchor: false is ignored");
    },
};
exports.default = def;
//# sourceMappingURL=recursiveAnchor.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const dynamicRef_1 = require("./dynamicRef");
const def = {
    keyword: "$recursiveRef",
    schemaType: "string",
    code: (cxt) => (0, dynamicRef_1.dynamicRef)(cxt, cxt.schema),
};
exports.default = def;
//# sourceMappingURL=recursiveRef.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=errors.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const error = {
    message: ({ schemaCode }) => (0, codegen_1.str) `must match format "${schemaCode}"`,
    params: ({ schemaCode }) => (0, codegen_1._) `{format: ${schemaCode}}`,
};
const def = {
    keyword: "format",
    type: ["number", "string"],
    schemaType: "string",
    $data: true,
    error,
    code(cxt, ruleType) {
        const { gen, data, $data, schema, schemaCode, it } = cxt;
        const { opts, errSchemaPath, schemaEnv, self } = it;
        if (!opts.validateFormats)
            return;
        if ($data)
            validate$DataFormat();
        else
            validateFormat();
        function validate$DataFormat() {
            const fmts = gen.scopeValue("formats", {
                ref: self.formats,
                code: opts.code.formats,
            });
            const fDef = gen.const("fDef", (0, codegen_1._) `${fmts}[${schemaCode}]`);
            const fType = gen.let("fType");
            const format = gen.let("format");
            // TODO simplify
            gen.if((0, codegen_1._) `typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, (0, codegen_1._) `${fDef}.type || "string"`).assign(format, (0, codegen_1._) `${fDef}.validate`), () => gen.assign(fType, (0, codegen_1._) `"string"`).assign(format, fDef));
            cxt.fail$data((0, codegen_1.or)(unknownFmt(), invalidFmt()));
            function unknownFmt() {
                if (opts.strictSchema === false)
                    return codegen_1.nil;
                return (0, codegen_1._) `${schemaCode} && !${format}`;
            }
            function invalidFmt() {
                const callFormat = schemaEnv.$async
                    ? (0, codegen_1._) `(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))`
                    : (0, codegen_1._) `${format}(${data})`;
                const validData = (0, codegen_1._) `(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`;
                return (0, codegen_1._) `${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`;
            }
        }
        function validateFormat() {
            const formatDef = self.formats[schema];
            if (!formatDef) {
                unknownFormat();
                return;
            }
            if (formatDef === true)
                return;
            const [fmtType, format, fmtRef] = getFormat(formatDef);
            if (fmtType === ruleType)
                cxt.pass(validCondition());
            function unknownFormat() {
                if (opts.strictSchema === false) {
                    self.logger.warn(unknownMsg());
                    return;
                }
                throw new Error(unknownMsg());
                function unknownMsg() {
                    return `unknown format "${schema}" ignored in schema at path "${errSchemaPath}"`;
                }
            }
            function getFormat(fmtDef) {
                const code = fmtDef instanceof RegExp
                    ? (0, codegen_1.regexpCode)(fmtDef)
                    : opts.code.formats
                        ? (0, codegen_1._) `${opts.code.formats}${(0, codegen_1.getProperty)(schema)}`
                        : undefined;
                const fmt = gen.scopeValue("formats", { key: schema, ref: fmtDef, code });
                if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) {
                    return [fmtDef.type || "string", fmtDef.validate, (0, codegen_1._) `${fmt}.validate`];
                }
                return ["string", fmtDef, fmt];
            }
            function validCondition() {
                if (typeof formatDef == "object" && !(formatDef instanceof RegExp) && formatDef.async) {
                    if (!schemaEnv.$async)
                        throw new Error("async format in sync schema");
                    return (0, codegen_1._) `await ${fmtRef}(${data})`;
                }
                return typeof format == "function" ? (0, codegen_1._) `${fmtRef}(${data})` : (0, codegen_1._) `${fmtRef}.test(${data})`;
            }
        }
    },
};
exports.default = def;
//# sourceMappingURL=format.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const format_1 = require("./format");
const format = [format_1.default];
exports.default = format;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const metadata_1 = require("./metadata");
const nullable_1 = require("./nullable");
const error_1 = require("./error");
const types_1 = require("../discriminator/types");
const error = {
    message: (cxt) => {
        const { schema, params } = cxt;
        return params.discrError
            ? params.discrError === types_1.DiscrError.Tag
                ? `tag "${schema}" must be string`
                : `value of tag "${schema}" must be in mapping`
            : (0, error_1.typeErrorMessage)(cxt, "object");
    },
    params: (cxt) => {
        const { schema, params } = cxt;
        return params.discrError
            ? (0, codegen_1._) `{error: ${params.discrError}, tag: ${schema}, tagValue: ${params.tag}}`
            : (0, error_1.typeErrorParams)(cxt, "object");
    },
};
const def = {
    keyword: "discriminator",
    schemaType: "string",
    implements: ["mapping"],
    error,
    code(cxt) {
        (0, metadata_1.checkMetadata)(cxt);
        const { gen, data, schema, parentSchema } = cxt;
        const [valid, cond] = (0, nullable_1.checkNullableObject)(cxt, data);
        gen.if(cond);
        validateDiscriminator();
        gen.elseIf((0, codegen_1.not)(valid));
        cxt.error();
        gen.endIf();
        cxt.ok(valid);
        function validateDiscriminator() {
            const tag = gen.const("tag", (0, codegen_1._) `${data}${(0, codegen_1.getProperty)(schema)}`);
            gen.if((0, codegen_1._) `${tag} === undefined`);
            cxt.error(false, { discrError: types_1.DiscrError.Tag, tag });
            gen.elseIf((0, codegen_1._) `typeof ${tag} == "string"`);
            validateMapping(tag);
            gen.else();
            cxt.error(false, { discrError: types_1.DiscrError.Tag, tag }, { instancePath: schema });
            gen.endIf();
        }
        function validateMapping(tag) {
            gen.if(false);
            for (const tagValue in parentSchema.mapping) {
                gen.elseIf((0, codegen_1._) `${tag} === ${tagValue}`);
                gen.assign(valid, applyTagSchema(tagValue));
            }
            gen.else();
            cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag }, { instancePath: schema, schemaPath: "mapping", parentSchema: true });
            gen.endIf();
        }
        function applyTagSchema(schemaProp) {
            const _valid = gen.name("valid");
            cxt.subschema({
                keyword: "mapping",
                schemaProp,
                jtdDiscriminator: schema,
            }, _valid);
            return _valid;
        }
    },
};
exports.default = def;
//# sourceMappingURL=discriminator.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("../../compile/util");
const code_1 = require("../code");
const codegen_1 = require("../../compile/codegen");
const metadata_1 = require("./metadata");
const nullable_1 = require("./nullable");
const error_1 = require("./error");
const def = {
    keyword: "elements",
    schemaType: "object",
    error: (0, error_1.typeError)("array"),
    code(cxt) {
        (0, metadata_1.checkMetadata)(cxt);
        const { gen, data, schema, it } = cxt;
        if ((0, util_1.alwaysValidSchema)(it, schema))
            return;
        const [valid] = (0, nullable_1.checkNullable)(cxt);
        gen.if((0, codegen_1.not)(valid), () => gen.if((0, codegen_1._) `Array.isArray(${data})`, () => gen.assign(valid, (0, code_1.validateArray)(cxt)), () => cxt.error()));
        cxt.ok(valid);
    },
};
exports.default = def;
//# sourceMappingURL=elements.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const metadata_1 = require("./metadata");
const nullable_1 = require("./nullable");
const error = {
    message: "must be equal to one of the allowed values",
    params: ({ schemaCode }) => (0, codegen_1._) `{allowedValues: ${schemaCode}}`,
};
const def = {
    keyword: "enum",
    schemaType: "array",
    error,
    code(cxt) {
        (0, metadata_1.checkMetadata)(cxt);
        const { gen, data, schema, schemaValue, parentSchema, it } = cxt;
        if (schema.length === 0)
            throw new Error("enum must have non-empty array");
        if (schema.length !== new Set(schema).size)
            throw new Error("enum items must be unique");
        let valid;
        const isString = (0, codegen_1._) `typeof ${data} == "string"`;
        if (schema.length >= it.opts.loopEnum) {
            let cond;
            [valid, cond] = (0, nullable_1.checkNullable)(cxt, isString);
            gen.if(cond, loopEnum);
        }
        else {
            /* istanbul ignore if */
            if (!Array.isArray(schema))
                throw new Error("ajv implementation error");
            valid = (0, codegen_1.and)(isString, (0, codegen_1.or)(...schema.map((value) => (0, codegen_1._) `${data} === ${value}`)));
            if (parentSchema.nullable)
                valid = (0, codegen_1.or)((0, codegen_1._) `${data} === null`, valid);
        }
        cxt.pass(valid);
        function loopEnum() {
            gen.forOf("v", schemaValue, (v) => gen.if((0, codegen_1._) `${valid} = ${data} === ${v}`, () => gen.break()));
        }
    },
};
exports.default = def;
//# sourceMappingURL=enum.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.typeErrorParams = exports.typeErrorMessage = exports.typeError = void 0;
const codegen_1 = require("../../compile/codegen");
function typeError(t) {
    return {
        message: (cxt) => typeErrorMessage(cxt, t),
        params: (cxt) => typeErrorParams(cxt, t),
    };
}
exports.typeError = typeError;
function typeErrorMessage({ parentSchema }, t) {
    return (parentSchema === null || parentSchema === void 0 ? void 0 : parentSchema.nullable) ? `must be ${t} or null` : `must be ${t}`;
}
exports.typeErrorMessage = typeErrorMessage;
function typeErrorParams({ parentSchema }, t) {
    return (0, codegen_1._) `{type: ${t}, nullable: ${!!(parentSchema === null || parentSchema === void 0 ? void 0 : parentSchema.nullable)}}`;
}
exports.typeErrorParams = typeErrorParams;
//# sourceMappingURL=error.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const ref_1 = require("./ref");
const type_1 = require("./type");
const enum_1 = require("./enum");
const elements_1 = require("./elements");
const properties_1 = require("./properties");
const optionalProperties_1 = require("./optionalProperties");
const discriminator_1 = require("./discriminator");
const values_1 = require("./values");
const union_1 = require("./union");
const metadata_1 = require("./metadata");
const jtdVocabulary = [
    "definitions",
    ref_1.default,
    type_1.default,
    enum_1.default,
    elements_1.default,
    properties_1.default,
    optionalProperties_1.default,
    discriminator_1.default,
    values_1.default,
    union_1.default,
    metadata_1.default,
    { keyword: "additionalProperties", schemaType: "boolean" },
    { keyword: "nullable", schemaType: "boolean" },
];
exports.default = jtdVocabulary;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkMetadata = void 0;
const util_1 = require("../../compile/util");
const def = {
    keyword: "metadata",
    schemaType: "object",
    code(cxt) {
        checkMetadata(cxt);
        const { gen, schema, it } = cxt;
        if ((0, util_1.alwaysValidSchema)(it, schema))
            return;
        const valid = gen.name("valid");
        cxt.subschema({ keyword: "metadata", jtdMetadata: true }, valid);
        cxt.ok(valid);
    },
};
function checkMetadata({ it, keyword }, metadata) {
    if (it.jtdMetadata !== metadata) {
        throw new Error(`JTD: "${keyword}" cannot be used in this schema location`);
    }
}
exports.checkMetadata = checkMetadata;
exports.default = def;
//# sourceMappingURL=metadata.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkNullableObject = exports.checkNullable = void 0;
const codegen_1 = require("../../compile/codegen");
function checkNullable({ gen, data, parentSchema }, cond = codegen_1.nil) {
    const valid = gen.name("valid");
    if (parentSchema.nullable) {
        gen.let(valid, (0, codegen_1._) `${data} === null`);
        cond = (0, codegen_1.not)(valid);
    }
    else {
        gen.let(valid, false);
    }
    return [valid, cond];
}
exports.checkNullable = checkNullable;
function checkNullableObject(cxt, cond) {
    const [valid, cond_] = checkNullable(cxt, cond);
    return [valid, (0, codegen_1._) `${cond_} && typeof ${cxt.data} == "object" && !Array.isArray(${cxt.data})`];
}
exports.checkNullableObject = checkNullableObject;
//# sourceMappingURL=nullable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const properties_1 = require("./properties");
const def = {
    keyword: "optionalProperties",
    schemaType: "object",
    error: properties_1.error,
    code(cxt) {
        if (cxt.parentSchema.properties)
            return;
        (0, properties_1.validateProperties)(cxt);
    },
};
exports.default = def;
//# sourceMappingURL=optionalProperties.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateProperties = exports.error = void 0;
const code_1 = require("../code");
const util_1 = require("../../compile/util");
const codegen_1 = require("../../compile/codegen");
const metadata_1 = require("./metadata");
const nullable_1 = require("./nullable");
const error_1 = require("./error");
var PropError;
(function (PropError) {
    PropError["Additional"] = "additional";
    PropError["Missing"] = "missing";
})(PropError || (PropError = {}));
exports.error = {
    message: (cxt) => {
        const { params } = cxt;
        return params.propError
            ? params.propError === PropError.Additional
                ? "must NOT have additional properties"
                : `must have property '${params.missingProperty}'`
            : (0, error_1.typeErrorMessage)(cxt, "object");
    },
    params: (cxt) => {
        const { params } = cxt;
        return params.propError
            ? params.propError === PropError.Additional
                ? (0, codegen_1._) `{error: ${params.propError}, additionalProperty: ${params.additionalProperty}}`
                : (0, codegen_1._) `{error: ${params.propError}, missingProperty: ${params.missingProperty}}`
            : (0, error_1.typeErrorParams)(cxt, "object");
    },
};
const def = {
    keyword: "properties",
    schemaType: "object",
    error: exports.error,
    code: validateProperties,
};
// const error: KeywordErrorDefinition = {
//   message: "should NOT have additional properties",
//   params: ({params}) => _`{additionalProperty: ${params.additionalProperty}}`,
// }
function validateProperties(cxt) {
    (0, metadata_1.checkMetadata)(cxt);
    const { gen, data, parentSchema, it } = cxt;
    const { additionalProperties, nullable } = parentSchema;
    if (it.jtdDiscriminator && nullable)
        throw new Error("JTD: nullable inside discriminator mapping");
    if (commonProperties()) {
        throw new Error("JTD: properties and optionalProperties have common members");
    }
    const [allProps, properties] = schemaProperties("properties");
    const [allOptProps, optProperties] = schemaProperties("optionalProperties");
    if (properties.length === 0 && optProperties.length === 0 && additionalProperties) {
        return;
    }
    const [valid, cond] = it.jtdDiscriminator === undefined
        ? (0, nullable_1.checkNullableObject)(cxt, data)
        : [gen.let("valid", false), true];
    gen.if(cond, () => gen.assign(valid, true).block(() => {
        validateProps(properties, "properties", true);
        validateProps(optProperties, "optionalProperties");
        if (!additionalProperties)
            validateAdditional();
    }));
    cxt.pass(valid);
    function commonProperties() {
        const props = parentSchema.properties;
        const optProps = parentSchema.optionalProperties;
        if (!(props && optProps))
            return false;
        for (const p in props) {
            if (Object.prototype.hasOwnProperty.call(optProps, p))
                return true;
        }
        return false;
    }
    function schemaProperties(keyword) {
        const schema = parentSchema[keyword];
        const allPs = schema ? (0, code_1.allSchemaProperties)(schema) : [];
        if (it.jtdDiscriminator && allPs.some((p) => p === it.jtdDiscriminator)) {
            throw new Error(`JTD: discriminator tag used in ${keyword}`);
        }
        const ps = allPs.filter((p) => !(0, util_1.alwaysValidSchema)(it, schema[p]));
        return [allPs, ps];
    }
    function validateProps(props, keyword, required) {
        const _valid = gen.var("valid");
        for (const prop of props) {
            gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties), () => applyPropertySchema(prop, keyword, _valid), () => missingProperty(prop));
            cxt.ok(_valid);
        }
        function missingProperty(prop) {
            if (required) {
                gen.assign(_valid, false);
                cxt.error(false, { propError: PropError.Missing, missingProperty: prop }, { schemaPath: prop });
            }
            else {
                gen.assign(_valid, true);
            }
        }
    }
    function applyPropertySchema(prop, keyword, _valid) {
        cxt.subschema({
            keyword,
            schemaProp: prop,
            dataProp: prop,
        }, _valid);
    }
    function validateAdditional() {
        gen.forIn("key", data, (key) => {
            const addProp = isAdditional(key, allProps, "properties", it.jtdDiscriminator);
            const addOptProp = isAdditional(key, allOptProps, "optionalProperties");
            const extra = addProp === true ? addOptProp : addOptProp === true ? addProp : (0, codegen_1.and)(addProp, addOptProp);
            gen.if(extra, () => {
                if (it.opts.removeAdditional) {
                    gen.code((0, codegen_1._) `delete ${data}[${key}]`);
                }
                else {
                    cxt.error(false, { propError: PropError.Additional, additionalProperty: key }, { instancePath: key, parentSchema: true });
                    if (!it.opts.allErrors)
                        gen.break();
                }
            });
        });
    }
    function isAdditional(key, props, keyword, jtdDiscriminator) {
        let additional;
        if (props.length > 8) {
            // TODO maybe an option instead of hard-coded 8?
            const propsSchema = (0, util_1.schemaRefOrVal)(it, parentSchema[keyword], keyword);
            additional = (0, codegen_1.not)((0, code_1.isOwnProperty)(gen, propsSchema, key));
            if (jtdDiscriminator !== undefined) {
                additional = (0, codegen_1.and)(additional, (0, codegen_1._) `${key} !== ${jtdDiscriminator}`);
            }
        }
        else if (props.length || jtdDiscriminator !== undefined) {
            const ps = jtdDiscriminator === undefined ? props : [jtdDiscriminator].concat(props);
            additional = (0, codegen_1.and)(...ps.map((p) => (0, codegen_1._) `${key} !== ${p}`));
        }
        else {
            additional = true;
        }
        return additional;
    }
}
exports.validateProperties = validateProperties;
exports.default = def;
//# sourceMappingURL=properties.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.hasRef = void 0;
const compile_1 = require("../../compile");
const codegen_1 = require("../../compile/codegen");
const ref_error_1 = require("../../compile/ref_error");
const names_1 = require("../../compile/names");
const ref_1 = require("../core/ref");
const metadata_1 = require("./metadata");
const def = {
    keyword: "ref",
    schemaType: "string",
    code(cxt) {
        (0, metadata_1.checkMetadata)(cxt);
        const { gen, data, schema: ref, parentSchema, it } = cxt;
        const { schemaEnv: { root }, } = it;
        const valid = gen.name("valid");
        if (parentSchema.nullable) {
            gen.var(valid, (0, codegen_1._) `${data} === null`);
            gen.if((0, codegen_1.not)(valid), validateJtdRef);
        }
        else {
            gen.var(valid, false);
            validateJtdRef();
        }
        cxt.ok(valid);
        function validateJtdRef() {
            var _a;
            const refSchema = (_a = root.schema.definitions) === null || _a === void 0 ? void 0 : _a[ref];
            if (!refSchema) {
                throw new ref_error_1.default(it.opts.uriResolver, "", ref, `No definition ${ref}`);
            }
            if (hasRef(refSchema) || !it.opts.inlineRefs)
                callValidate(refSchema);
            else
                inlineRefSchema(refSchema);
        }
        function callValidate(schema) {
            const sch = compile_1.compileSchema.call(it.self, new compile_1.SchemaEnv({ schema, root, schemaPath: `/definitions/${ref}` }));
            const v = (0, ref_1.getValidate)(cxt, sch);
            const errsCount = gen.const("_errs", names_1.default.errors);
            (0, ref_1.callRef)(cxt, v, sch, sch.$async);
            gen.assign(valid, (0, codegen_1._) `${errsCount} === ${names_1.default.errors}`);
        }
        function inlineRefSchema(schema) {
            const schName = gen.scopeValue("schema", it.opts.code.source === true ? { ref: schema, code: (0, codegen_1.stringify)(schema) } : { ref: schema });
            cxt.subschema({
                schema,
                dataTypes: [],
                schemaPath: codegen_1.nil,
                topSchemaRef: schName,
                errSchemaPath: `/definitions/${ref}`,
            }, valid);
        }
    },
};
function hasRef(schema) {
    for (const key in schema) {
        let sch;
        if (key === "ref" || (typeof (sch = schema[key]) == "object" && hasRef(sch)))
            return true;
    }
    return false;
}
exports.hasRef = hasRef;
exports.default = def;
//# sourceMappingURL=ref.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.intRange = void 0;
const codegen_1 = require("../../compile/codegen");
const timestamp_1 = require("../../runtime/timestamp");
const util_1 = require("../../compile/util");
const metadata_1 = require("./metadata");
const error_1 = require("./error");
exports.intRange = {
    int8: [-128, 127, 3],
    uint8: [0, 255, 3],
    int16: [-32768, 32767, 5],
    uint16: [0, 65535, 5],
    int32: [-2147483648, 2147483647, 10],
    uint32: [0, 4294967295, 10],
};
const error = {
    message: (cxt) => (0, error_1.typeErrorMessage)(cxt, cxt.schema),
    params: (cxt) => (0, error_1.typeErrorParams)(cxt, cxt.schema),
};
function timestampCode(cxt) {
    const { gen, data, it } = cxt;
    const { timestamp, allowDate } = it.opts;
    if (timestamp === "date")
        return (0, codegen_1._) `${data} instanceof Date `;
    const vts = (0, util_1.useFunc)(gen, timestamp_1.default);
    const allowDateArg = allowDate ? (0, codegen_1._) `, true` : codegen_1.nil;
    const validString = (0, codegen_1._) `typeof ${data} == "string" && ${vts}(${data}${allowDateArg})`;
    return timestamp === "string" ? validString : (0, codegen_1.or)((0, codegen_1._) `${data} instanceof Date`, validString);
}
const def = {
    keyword: "type",
    schemaType: "string",
    error,
    code(cxt) {
        (0, metadata_1.checkMetadata)(cxt);
        const { data, schema, parentSchema, it } = cxt;
        let cond;
        switch (schema) {
            case "boolean":
            case "string":
                cond = (0, codegen_1._) `typeof ${data} == ${schema}`;
                break;
            case "timestamp": {
                cond = timestampCode(cxt);
                break;
            }
            case "float32":
            case "float64":
                cond = (0, codegen_1._) `typeof ${data} == "number"`;
                break;
            default: {
                const sch = schema;
                cond = (0, codegen_1._) `typeof ${data} == "number" && isFinite(${data}) && !(${data} % 1)`;
                if (!it.opts.int32range && (sch === "int32" || sch === "uint32")) {
                    if (sch === "uint32")
                        cond = (0, codegen_1._) `${cond} && ${data} >= 0`;
                }
                else {
                    const [min, max] = exports.intRange[sch];
                    cond = (0, codegen_1._) `${cond} && ${data} >= ${min} && ${data} <= ${max}`;
                }
            }
        }
        cxt.pass(parentSchema.nullable ? (0, codegen_1.or)((0, codegen_1._) `${data} === null`, cond) : cond);
    },
};
exports.default = def;
//# sourceMappingURL=type.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const code_1 = require("../code");
const def = {
    keyword: "union",
    schemaType: "array",
    trackErrors: true,
    code: code_1.validateUnion,
    error: { message: "must match a schema in union" },
};
exports.default = def;
//# sourceMappingURL=union.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("../../compile/util");
const codegen_1 = require("../../compile/codegen");
const metadata_1 = require("./metadata");
const nullable_1 = require("./nullable");
const error_1 = require("./error");
const def = {
    keyword: "values",
    schemaType: "object",
    error: (0, error_1.typeError)("object"),
    code(cxt) {
        (0, metadata_1.checkMetadata)(cxt);
        const { gen, data, schema, it } = cxt;
        const [valid, cond] = (0, nullable_1.checkNullableObject)(cxt, data);
        if ((0, util_1.alwaysValidSchema)(it, schema)) {
            gen.if((0, codegen_1.not)((0, codegen_1.or)(cond, valid)), () => cxt.error());
        }
        else {
            gen.if(cond);
            gen.assign(valid, validateMap());
            gen.elseIf((0, codegen_1.not)(valid));
            cxt.error();
            gen.endIf();
        }
        cxt.ok(valid);
        function validateMap() {
            const _valid = gen.name("valid");
            if (it.allErrors) {
                const validMap = gen.let("valid", true);
                validateValues(() => gen.assign(validMap, false));
                return validMap;
            }
            gen.var(_valid, true);
            validateValues(() => gen.break());
            return _valid;
            function validateValues(notValid) {
                gen.forIn("key", data, (key) => {
                    cxt.subschema({
                        keyword: "values",
                        dataProp: key,
                        dataPropType: util_1.Type.Str,
                    }, _valid);
                    gen.if((0, codegen_1.not)(_valid), notValid);
                });
            }
        }
    },
};
exports.default = def;
//# sourceMappingURL=values.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.contentVocabulary = exports.metadataVocabulary = void 0;
exports.metadataVocabulary = [
    "title",
    "description",
    "default",
    "deprecated",
    "readOnly",
    "writeOnly",
    "examples",
];
exports.contentVocabulary = [
    "contentMediaType",
    "contentEncoding",
    "contentSchema",
];
//# sourceMappingURL=metadata.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const dependentRequired_1 = require("./validation/dependentRequired");
const dependentSchemas_1 = require("./applicator/dependentSchemas");
const limitContains_1 = require("./validation/limitContains");
const next = [dependentRequired_1.default, dependentSchemas_1.default, limitContains_1.default];
exports.default = next;
//# sourceMappingURL=next.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const unevaluatedProperties_1 = require("./unevaluatedProperties");
const unevaluatedItems_1 = require("./unevaluatedItems");
const unevaluated = [unevaluatedProperties_1.default, unevaluatedItems_1.default];
exports.default = unevaluated;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const error = {
    message: ({ params: { len } }) => (0, codegen_1.str) `must NOT have more than ${len} items`,
    params: ({ params: { len } }) => (0, codegen_1._) `{limit: ${len}}`,
};
const def = {
    keyword: "unevaluatedItems",
    type: "array",
    schemaType: ["boolean", "object"],
    error,
    code(cxt) {
        const { gen, schema, data, it } = cxt;
        const items = it.items || 0;
        if (items === true)
            return;
        const len = gen.const("len", (0, codegen_1._) `${data}.length`);
        if (schema === false) {
            cxt.setParams({ len: items });
            cxt.fail((0, codegen_1._) `${len} > ${items}`);
        }
        else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) {
            const valid = gen.var("valid", (0, codegen_1._) `${len} <= ${items}`);
            gen.if((0, codegen_1.not)(valid), () => validateItems(valid, items));
            cxt.ok(valid);
        }
        it.items = true;
        function validateItems(valid, from) {
            gen.forRange("i", from, len, (i) => {
                cxt.subschema({ keyword: "unevaluatedItems", dataProp: i, dataPropType: util_1.Type.Num }, valid);
                if (!it.allErrors)
                    gen.if((0, codegen_1.not)(valid), () => gen.break());
            });
        }
    },
};
exports.default = def;
//# sourceMappingURL=unevaluatedItems.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const names_1 = require("../../compile/names");
const error = {
    message: "must NOT have unevaluated properties",
    params: ({ params }) => (0, codegen_1._) `{unevaluatedProperty: ${params.unevaluatedProperty}}`,
};
const def = {
    keyword: "unevaluatedProperties",
    type: "object",
    schemaType: ["boolean", "object"],
    trackErrors: true,
    error,
    code(cxt) {
        const { gen, schema, data, errsCount, it } = cxt;
        /* istanbul ignore if */
        if (!errsCount)
            throw new Error("ajv implementation error");
        const { allErrors, props } = it;
        if (props instanceof codegen_1.Name) {
            gen.if((0, codegen_1._) `${props} !== true`, () => gen.forIn("key", data, (key) => gen.if(unevaluatedDynamic(props, key), () => unevaluatedPropCode(key))));
        }
        else if (props !== true) {
            gen.forIn("key", data, (key) => props === undefined
                ? unevaluatedPropCode(key)
                : gen.if(unevaluatedStatic(props, key), () => unevaluatedPropCode(key)));
        }
        it.props = true;
        cxt.ok((0, codegen_1._) `${errsCount} === ${names_1.default.errors}`);
        function unevaluatedPropCode(key) {
            if (schema === false) {
                cxt.setParams({ unevaluatedProperty: key });
                cxt.error();
                if (!allErrors)
                    gen.break();
                return;
            }
            if (!(0, util_1.alwaysValidSchema)(it, schema)) {
                const valid = gen.name("valid");
                cxt.subschema({
                    keyword: "unevaluatedProperties",
                    dataProp: key,
                    dataPropType: util_1.Type.Str,
                }, valid);
                if (!allErrors)
                    gen.if((0, codegen_1.not)(valid), () => gen.break());
            }
        }
        function unevaluatedDynamic(evaluatedProps, key) {
            return (0, codegen_1._) `!${evaluatedProps} || !${evaluatedProps}[${key}]`;
        }
        function unevaluatedStatic(evaluatedProps, key) {
            const ps = [];
            for (const p in evaluatedProps) {
                if (evaluatedProps[p] === true)
                    ps.push((0, codegen_1._) `${key} !== ${p}`);
            }
            return (0, codegen_1.and)(...ps);
        }
    },
};
exports.default = def;
//# sourceMappingURL=unevaluatedProperties.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const equal_1 = require("../../runtime/equal");
const error = {
    message: "must be equal to constant",
    params: ({ schemaCode }) => (0, codegen_1._) `{allowedValue: ${schemaCode}}`,
};
const def = {
    keyword: "const",
    $data: true,
    error,
    code(cxt) {
        const { gen, data, $data, schemaCode, schema } = cxt;
        if ($data || (schema && typeof schema == "object")) {
            cxt.fail$data((0, codegen_1._) `!${(0, util_1.useFunc)(gen, equal_1.default)}(${data}, ${schemaCode})`);
        }
        else {
            cxt.fail((0, codegen_1._) `${schema} !== ${data}`);
        }
    },
};
exports.default = def;
//# sourceMappingURL=const.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const dependencies_1 = require("../applicator/dependencies");
const def = {
    keyword: "dependentRequired",
    type: "object",
    schemaType: "object",
    error: dependencies_1.error,
    code: (cxt) => (0, dependencies_1.validatePropertyDeps)(cxt),
};
exports.default = def;
//# sourceMappingURL=dependentRequired.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const equal_1 = require("../../runtime/equal");
const error = {
    message: "must be equal to one of the allowed values",
    params: ({ schemaCode }) => (0, codegen_1._) `{allowedValues: ${schemaCode}}`,
};
const def = {
    keyword: "enum",
    schemaType: "array",
    $data: true,
    error,
    code(cxt) {
        const { gen, data, $data, schema, schemaCode, it } = cxt;
        if (!$data && schema.length === 0)
            throw new Error("enum must have non-empty array");
        const useLoop = schema.length >= it.opts.loopEnum;
        let eql;
        const getEql = () => (eql !== null && eql !== void 0 ? eql : (eql = (0, util_1.useFunc)(gen, equal_1.default)));
        let valid;
        if (useLoop || $data) {
            valid = gen.let("valid");
            cxt.block$data(valid, loopEnum);
        }
        else {
            /* istanbul ignore if */
            if (!Array.isArray(schema))
                throw new Error("ajv implementation error");
            const vSchema = gen.const("vSchema", schemaCode);
            valid = (0, codegen_1.or)(...schema.map((_x, i) => equalCode(vSchema, i)));
        }
        cxt.pass(valid);
        function loopEnum() {
            gen.assign(valid, false);
            gen.forOf("v", schemaCode, (v) => gen.if((0, codegen_1._) `${getEql()}(${data}, ${v})`, () => gen.assign(valid, true).break()));
        }
        function equalCode(vSchema, i) {
            const sch = schema[i];
            return typeof sch === "object" && sch !== null
                ? (0, codegen_1._) `${getEql()}(${data}, ${vSchema}[${i}])`
                : (0, codegen_1._) `${data} === ${sch}`;
        }
    },
};
exports.default = def;
//# sourceMappingURL=enum.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const limitNumber_1 = require("./limitNumber");
const multipleOf_1 = require("./multipleOf");
const limitLength_1 = require("./limitLength");
const pattern_1 = require("./pattern");
const limitProperties_1 = require("./limitProperties");
const required_1 = require("./required");
const limitItems_1 = require("./limitItems");
const uniqueItems_1 = require("./uniqueItems");
const const_1 = require("./const");
const enum_1 = require("./enum");
const validation = [
    // number
    limitNumber_1.default,
    multipleOf_1.default,
    // string
    limitLength_1.default,
    pattern_1.default,
    // object
    limitProperties_1.default,
    required_1.default,
    // array
    limitItems_1.default,
    uniqueItems_1.default,
    // any
    { keyword: "type", schemaType: ["string", "array"] },
    { keyword: "nullable", schemaType: "boolean" },
    const_1.default,
    enum_1.default,
];
exports.default = validation;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("../../compile/util");
const def = {
    keyword: ["maxContains", "minContains"],
    type: "array",
    schemaType: "number",
    code({ keyword, parentSchema, it }) {
        if (parentSchema.contains === undefined) {
            (0, util_1.checkStrictMode)(it, `"${keyword}" without "contains" is ignored`);
        }
    },
};
exports.default = def;
//# sourceMappingURL=limitContains.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const error = {
    message({ keyword, schemaCode }) {
        const comp = keyword === "maxItems" ? "more" : "fewer";
        return (0, codegen_1.str) `must NOT have ${comp} than ${schemaCode} items`;
    },
    params: ({ schemaCode }) => (0, codegen_1._) `{limit: ${schemaCode}}`,
};
const def = {
    keyword: ["maxItems", "minItems"],
    type: "array",
    schemaType: "number",
    $data: true,
    error,
    code(cxt) {
        const { keyword, data, schemaCode } = cxt;
        const op = keyword === "maxItems" ? codegen_1.operators.GT : codegen_1.operators.LT;
        cxt.fail$data((0, codegen_1._) `${data}.length ${op} ${schemaCode}`);
    },
};
exports.default = def;
//# sourceMappingURL=limitItems.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const ucs2length_1 = require("../../runtime/ucs2length");
const error = {
    message({ keyword, schemaCode }) {
        const comp = keyword === "maxLength" ? "more" : "fewer";
        return (0, codegen_1.str) `must NOT have ${comp} than ${schemaCode} characters`;
    },
    params: ({ schemaCode }) => (0, codegen_1._) `{limit: ${schemaCode}}`,
};
const def = {
    keyword: ["maxLength", "minLength"],
    type: "string",
    schemaType: "number",
    $data: true,
    error,
    code(cxt) {
        const { keyword, data, schemaCode, it } = cxt;
        const op = keyword === "maxLength" ? codegen_1.operators.GT : codegen_1.operators.LT;
        const len = it.opts.unicode === false ? (0, codegen_1._) `${data}.length` : (0, codegen_1._) `${(0, util_1.useFunc)(cxt.gen, ucs2length_1.default)}(${data})`;
        cxt.fail$data((0, codegen_1._) `${len} ${op} ${schemaCode}`);
    },
};
exports.default = def;
//# sourceMappingURL=limitLength.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const ops = codegen_1.operators;
const KWDs = {
    maximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT },
    minimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT },
    exclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE },
    exclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE },
};
const error = {
    message: ({ keyword, schemaCode }) => (0, codegen_1.str) `must be ${KWDs[keyword].okStr} ${schemaCode}`,
    params: ({ keyword, schemaCode }) => (0, codegen_1._) `{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}`,
};
const def = {
    keyword: Object.keys(KWDs),
    type: "number",
    schemaType: "number",
    $data: true,
    error,
    code(cxt) {
        const { keyword, data, schemaCode } = cxt;
        cxt.fail$data((0, codegen_1._) `${data} ${KWDs[keyword].fail} ${schemaCode} || isNaN(${data})`);
    },
};
exports.default = def;
//# sourceMappingURL=limitNumber.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const error = {
    message({ keyword, schemaCode }) {
        const comp = keyword === "maxProperties" ? "more" : "fewer";
        return (0, codegen_1.str) `must NOT have ${comp} than ${schemaCode} properties`;
    },
    params: ({ schemaCode }) => (0, codegen_1._) `{limit: ${schemaCode}}`,
};
const def = {
    keyword: ["maxProperties", "minProperties"],
    type: "object",
    schemaType: "number",
    $data: true,
    error,
    code(cxt) {
        const { keyword, data, schemaCode } = cxt;
        const op = keyword === "maxProperties" ? codegen_1.operators.GT : codegen_1.operators.LT;
        cxt.fail$data((0, codegen_1._) `Object.keys(${data}).length ${op} ${schemaCode}`);
    },
};
exports.default = def;
//# sourceMappingURL=limitProperties.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const codegen_1 = require("../../compile/codegen");
const error = {
    message: ({ schemaCode }) => (0, codegen_1.str) `must be multiple of ${schemaCode}`,
    params: ({ schemaCode }) => (0, codegen_1._) `{multipleOf: ${schemaCode}}`,
};
const def = {
    keyword: "multipleOf",
    type: "number",
    schemaType: "number",
    $data: true,
    error,
    code(cxt) {
        const { gen, data, schemaCode, it } = cxt;
        // const bdt = bad$DataType(schemaCode, <string>def.schemaType, $data)
        const prec = it.opts.multipleOfPrecision;
        const res = gen.let("res");
        const invalid = prec
            ? (0, codegen_1._) `Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}`
            : (0, codegen_1._) `${res} !== parseInt(${res})`;
        cxt.fail$data((0, codegen_1._) `(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`);
    },
};
exports.default = def;
//# sourceMappingURL=multipleOf.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const code_1 = require("../code");
const util_1 = require("../../compile/util");
const codegen_1 = require("../../compile/codegen");
const error = {
    message: ({ schemaCode }) => (0, codegen_1.str) `must match pattern "${schemaCode}"`,
    params: ({ schemaCode }) => (0, codegen_1._) `{pattern: ${schemaCode}}`,
};
const def = {
    keyword: "pattern",
    type: "string",
    schemaType: "string",
    $data: true,
    error,
    code(cxt) {
        const { gen, data, $data, schema, schemaCode, it } = cxt;
        const u = it.opts.unicodeRegExp ? "u" : "";
        if ($data) {
            const { regExp } = it.opts.code;
            const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._) `new RegExp` : (0, util_1.useFunc)(gen, regExp);
            const valid = gen.let("valid");
            gen.try(() => gen.assign(valid, (0, codegen_1._) `${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false));
            cxt.fail$data((0, codegen_1._) `!${valid}`);
        }
        else {
            const regExp = (0, code_1.usePattern)(cxt, schema);
            cxt.fail$data((0, codegen_1._) `!${regExp}.test(${data})`);
        }
    },
};
exports.default = def;
//# sourceMappingURL=pattern.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const code_1 = require("../code");
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const error = {
    message: ({ params: { missingProperty } }) => (0, codegen_1.str) `must have required property '${missingProperty}'`,
    params: ({ params: { missingProperty } }) => (0, codegen_1._) `{missingProperty: ${missingProperty}}`,
};
const def = {
    keyword: "required",
    type: "object",
    schemaType: "array",
    $data: true,
    error,
    code(cxt) {
        const { gen, schema, schemaCode, data, $data, it } = cxt;
        const { opts } = it;
        if (!$data && schema.length === 0)
            return;
        const useLoop = schema.length >= opts.loopRequired;
        if (it.allErrors)
            allErrorsMode();
        else
            exitOnErrorMode();
        if (opts.strictRequired) {
            const props = cxt.parentSchema.properties;
            const { definedProperties } = cxt.it;
            for (const requiredKey of schema) {
                if ((props === null || props === void 0 ? void 0 : props[requiredKey]) === undefined && !definedProperties.has(requiredKey)) {
                    const schemaPath = it.schemaEnv.baseId + it.errSchemaPath;
                    const msg = `required property "${requiredKey}" is not defined at "${schemaPath}" (strictRequired)`;
                    (0, util_1.checkStrictMode)(it, msg, it.opts.strictRequired);
                }
            }
        }
        function allErrorsMode() {
            if (useLoop || $data) {
                cxt.block$data(codegen_1.nil, loopAllRequired);
            }
            else {
                for (const prop of schema) {
                    (0, code_1.checkReportMissingProp)(cxt, prop);
                }
            }
        }
        function exitOnErrorMode() {
            const missing = gen.let("missing");
            if (useLoop || $data) {
                const valid = gen.let("valid", true);
                cxt.block$data(valid, () => loopUntilMissing(missing, valid));
                cxt.ok(valid);
            }
            else {
                gen.if((0, code_1.checkMissingProp)(cxt, schema, missing));
                (0, code_1.reportMissingProp)(cxt, missing);
                gen.else();
            }
        }
        function loopAllRequired() {
            gen.forOf("prop", schemaCode, (prop) => {
                cxt.setParams({ missingProperty: prop });
                gen.if((0, code_1.noPropertyInData)(gen, data, prop, opts.ownProperties), () => cxt.error());
            });
        }
        function loopUntilMissing(missing, valid) {
            cxt.setParams({ missingProperty: missing });
            gen.forOf(missing, schemaCode, () => {
                gen.assign(valid, (0, code_1.propertyInData)(gen, data, missing, opts.ownProperties));
                gen.if((0, codegen_1.not)(valid), () => {
                    cxt.error();
                    gen.break();
                });
            }, codegen_1.nil);
        }
    },
};
exports.default = def;
//# sourceMappingURL=required.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const dataType_1 = require("../../compile/validate/dataType");
const codegen_1 = require("../../compile/codegen");
const util_1 = require("../../compile/util");
const equal_1 = require("../../runtime/equal");
const error = {
    message: ({ params: { i, j } }) => (0, codegen_1.str) `must NOT have duplicate items (items ## ${j} and ${i} are identical)`,
    params: ({ params: { i, j } }) => (0, codegen_1._) `{i: ${i}, j: ${j}}`,
};
const def = {
    keyword: "uniqueItems",
    type: "array",
    schemaType: "boolean",
    $data: true,
    error,
    code(cxt) {
        const { gen, data, $data, schema, parentSchema, schemaCode, it } = cxt;
        if (!$data && !schema)
            return;
        const valid = gen.let("valid");
        const itemTypes = parentSchema.items ? (0, dataType_1.getSchemaTypes)(parentSchema.items) : [];
        cxt.block$data(valid, validateUniqueItems, (0, codegen_1._) `${schemaCode} === false`);
        cxt.ok(valid);
        function validateUniqueItems() {
            const i = gen.let("i", (0, codegen_1._) `${data}.length`);
            const j = gen.let("j");
            cxt.setParams({ i, j });
            gen.assign(valid, true);
            gen.if((0, codegen_1._) `${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j));
        }
        function canOptimize() {
            return itemTypes.length > 0 && !itemTypes.some((t) => t === "object" || t === "array");
        }
        function loopN(i, j) {
            const item = gen.name("item");
            const wrongType = (0, dataType_1.checkDataTypes)(itemTypes, item, it.opts.strictNumbers, dataType_1.DataType.Wrong);
            const indices = gen.const("indices", (0, codegen_1._) `{}`);
            gen.for((0, codegen_1._) `;${i}--;`, () => {
                gen.let(item, (0, codegen_1._) `${data}[${i}]`);
                gen.if(wrongType, (0, codegen_1._) `continue`);
                if (itemTypes.length > 1)
                    gen.if((0, codegen_1._) `typeof ${item} == "string"`, (0, codegen_1._) `${item} += "_"`);
                gen
                    .if((0, codegen_1._) `typeof ${indices}[${item}] == "number"`, () => {
                    gen.assign(j, (0, codegen_1._) `${indices}[${item}]`);
                    cxt.error();
                    gen.assign(valid, false).break();
                })
                    .code((0, codegen_1._) `${indices}[${item}] = ${i}`);
            });
        }
        function loopN2(i, j) {
            const eql = (0, util_1.useFunc)(gen, equal_1.default);
            const outer = gen.name("outer");
            gen.label(outer).for((0, codegen_1._) `;${i}--;`, () => gen.for((0, codegen_1._) `${j} = ${i}; ${j}--;`, () => gen.if((0, codegen_1._) `${eql}(${data}[${i}], ${data}[${j}])`, () => {
                cxt.error();
                gen.assign(valid, false).break(outer);
            })));
        }
    },
};
exports.default = def;
//# sourceMappingURL=uniqueItems.js.map{
  "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",
  "description": "Meta-schema for $data reference (JSON AnySchema extension proposal)",
  "type": "object",
  "required": ["$data"],
  "properties": {
    "$data": {
      "type": "string",
      "anyOf": [{"format": "relative-json-pointer"}, {"format": "json-pointer"}]
    }
  },
  "additionalProperties": false
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/applicator",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/applicator": true
  },
  "$recursiveAnchor": true,

  "title": "Applicator vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "additionalItems": {"$recursiveRef": "#"},
    "unevaluatedItems": {"$recursiveRef": "#"},
    "items": {
      "anyOf": [{"$recursiveRef": "#"}, {"$ref": "#/$defs/schemaArray"}]
    },
    "contains": {"$recursiveRef": "#"},
    "additionalProperties": {"$recursiveRef": "#"},
    "unevaluatedProperties": {"$recursiveRef": "#"},
    "properties": {
      "type": "object",
      "additionalProperties": {"$recursiveRef": "#"},
      "default": {}
    },
    "patternProperties": {
      "type": "object",
      "additionalProperties": {"$recursiveRef": "#"},
      "propertyNames": {"format": "regex"},
      "default": {}
    },
    "dependentSchemas": {
      "type": "object",
      "additionalProperties": {
        "$recursiveRef": "#"
      }
    },
    "propertyNames": {"$recursiveRef": "#"},
    "if": {"$recursiveRef": "#"},
    "then": {"$recursiveRef": "#"},
    "else": {"$recursiveRef": "#"},
    "allOf": {"$ref": "#/$defs/schemaArray"},
    "anyOf": {"$ref": "#/$defs/schemaArray"},
    "oneOf": {"$ref": "#/$defs/schemaArray"},
    "not": {"$recursiveRef": "#"}
  },
  "$defs": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$recursiveRef": "#"}
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/content",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/content": true
  },
  "$recursiveAnchor": true,

  "title": "Content vocabulary meta-schema",

  "type": ["object", "boolean"],
  "properties": {
    "contentMediaType": {"type": "string"},
    "contentEncoding": {"type": "string"},
    "contentSchema": {"$recursiveRef": "#"}
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/core",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/core": true
  },
  "$recursiveAnchor": true,

  "title": "Core vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "$id": {
      "type": "string",
      "format": "uri-reference",
      "$comment": "Non-empty fragments not allowed.",
      "pattern": "^[^#]*#?$"
    },
    "$schema": {
      "type": "string",
      "format": "uri"
    },
    "$anchor": {
      "type": "string",
      "pattern": "^[A-Za-z][-A-Za-z0-9.:_]*$"
    },
    "$ref": {
      "type": "string",
      "format": "uri-reference"
    },
    "$recursiveRef": {
      "type": "string",
      "format": "uri-reference"
    },
    "$recursiveAnchor": {
      "type": "boolean",
      "default": false
    },
    "$vocabulary": {
      "type": "object",
      "propertyNames": {
        "type": "string",
        "format": "uri"
      },
      "additionalProperties": {
        "type": "boolean"
      }
    },
    "$comment": {
      "type": "string"
    },
    "$defs": {
      "type": "object",
      "additionalProperties": {"$recursiveRef": "#"},
      "default": {}
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/format",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/format": true
  },
  "$recursiveAnchor": true,

  "title": "Format vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "format": {"type": "string"}
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/meta-data",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/meta-data": true
  },
  "$recursiveAnchor": true,

  "title": "Meta-data vocabulary meta-schema",

  "type": ["object", "boolean"],
  "properties": {
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "default": true,
    "deprecated": {
      "type": "boolean",
      "default": false
    },
    "readOnly": {
      "type": "boolean",
      "default": false
    },
    "writeOnly": {
      "type": "boolean",
      "default": false
    },
    "examples": {
      "type": "array",
      "items": true
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/meta/validation",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/validation": true
  },
  "$recursiveAnchor": true,

  "title": "Validation vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "multipleOf": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "maximum": {
      "type": "number"
    },
    "exclusiveMaximum": {
      "type": "number"
    },
    "minimum": {
      "type": "number"
    },
    "exclusiveMinimum": {
      "type": "number"
    },
    "maxLength": {"$ref": "#/$defs/nonNegativeInteger"},
    "minLength": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "pattern": {
      "type": "string",
      "format": "regex"
    },
    "maxItems": {"$ref": "#/$defs/nonNegativeInteger"},
    "minItems": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "uniqueItems": {
      "type": "boolean",
      "default": false
    },
    "maxContains": {"$ref": "#/$defs/nonNegativeInteger"},
    "minContains": {
      "$ref": "#/$defs/nonNegativeInteger",
      "default": 1
    },
    "maxProperties": {"$ref": "#/$defs/nonNegativeInteger"},
    "minProperties": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "required": {"$ref": "#/$defs/stringArray"},
    "dependentRequired": {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/$defs/stringArray"
      }
    },
    "const": true,
    "enum": {
      "type": "array",
      "items": true
    },
    "type": {
      "anyOf": [
        {"$ref": "#/$defs/simpleTypes"},
        {
          "type": "array",
          "items": {"$ref": "#/$defs/simpleTypes"},
          "minItems": 1,
          "uniqueItems": true
        }
      ]
    }
  },
  "$defs": {
    "nonNegativeInteger": {
      "type": "integer",
      "minimum": 0
    },
    "nonNegativeIntegerDefault0": {
      "$ref": "#/$defs/nonNegativeInteger",
      "default": 0
    },
    "simpleTypes": {
      "enum": ["array", "boolean", "integer", "null", "number", "object", "string"]
    },
    "stringArray": {
      "type": "array",
      "items": {"type": "string"},
      "uniqueItems": true,
      "default": []
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://json-schema.org/draft/2019-09/schema",
  "$vocabulary": {
    "https://json-schema.org/draft/2019-09/vocab/core": true,
    "https://json-schema.org/draft/2019-09/vocab/applicator": true,
    "https://json-schema.org/draft/2019-09/vocab/validation": true,
    "https://json-schema.org/draft/2019-09/vocab/meta-data": true,
    "https://json-schema.org/draft/2019-09/vocab/format": false,
    "https://json-schema.org/draft/2019-09/vocab/content": true
  },
  "$recursiveAnchor": true,

  "title": "Core and Validation specifications meta-schema",
  "allOf": [
    {"$ref": "meta/core"},
    {"$ref": "meta/applicator"},
    {"$ref": "meta/validation"},
    {"$ref": "meta/meta-data"},
    {"$ref": "meta/format"},
    {"$ref": "meta/content"}
  ],
  "type": ["object", "boolean"],
  "properties": {
    "definitions": {
      "$comment": "While no longer an official keyword as it is replaced by $defs, this keyword is retained in the meta-schema to prevent incompatible extensions as it remains in common use.",
      "type": "object",
      "additionalProperties": {"$recursiveRef": "#"},
      "default": {}
    },
    "dependencies": {
      "$comment": "\"dependencies\" is no longer a keyword, but schema authors should avoid redefining it to facilitate a smooth transition to \"dependentSchemas\" and \"dependentRequired\"",
      "type": "object",
      "additionalProperties": {
        "anyOf": [{"$recursiveRef": "#"}, {"$ref": "meta/validation#/$defs/stringArray"}]
      }
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/applicator",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/applicator": true
  },
  "$dynamicAnchor": "meta",

  "title": "Applicator vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "prefixItems": {"$ref": "#/$defs/schemaArray"},
    "items": {"$dynamicRef": "#meta"},
    "contains": {"$dynamicRef": "#meta"},
    "additionalProperties": {"$dynamicRef": "#meta"},
    "properties": {
      "type": "object",
      "additionalProperties": {"$dynamicRef": "#meta"},
      "default": {}
    },
    "patternProperties": {
      "type": "object",
      "additionalProperties": {"$dynamicRef": "#meta"},
      "propertyNames": {"format": "regex"},
      "default": {}
    },
    "dependentSchemas": {
      "type": "object",
      "additionalProperties": {"$dynamicRef": "#meta"},
      "default": {}
    },
    "propertyNames": {"$dynamicRef": "#meta"},
    "if": {"$dynamicRef": "#meta"},
    "then": {"$dynamicRef": "#meta"},
    "else": {"$dynamicRef": "#meta"},
    "allOf": {"$ref": "#/$defs/schemaArray"},
    "anyOf": {"$ref": "#/$defs/schemaArray"},
    "oneOf": {"$ref": "#/$defs/schemaArray"},
    "not": {"$dynamicRef": "#meta"}
  },
  "$defs": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$dynamicRef": "#meta"}
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/content",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/content": true
  },
  "$dynamicAnchor": "meta",

  "title": "Content vocabulary meta-schema",

  "type": ["object", "boolean"],
  "properties": {
    "contentEncoding": {"type": "string"},
    "contentMediaType": {"type": "string"},
    "contentSchema": {"$dynamicRef": "#meta"}
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/core",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/core": true
  },
  "$dynamicAnchor": "meta",

  "title": "Core vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "$id": {
      "$ref": "#/$defs/uriReferenceString",
      "$comment": "Non-empty fragments not allowed.",
      "pattern": "^[^#]*#?$"
    },
    "$schema": {"$ref": "#/$defs/uriString"},
    "$ref": {"$ref": "#/$defs/uriReferenceString"},
    "$anchor": {"$ref": "#/$defs/anchorString"},
    "$dynamicRef": {"$ref": "#/$defs/uriReferenceString"},
    "$dynamicAnchor": {"$ref": "#/$defs/anchorString"},
    "$vocabulary": {
      "type": "object",
      "propertyNames": {"$ref": "#/$defs/uriString"},
      "additionalProperties": {
        "type": "boolean"
      }
    },
    "$comment": {
      "type": "string"
    },
    "$defs": {
      "type": "object",
      "additionalProperties": {"$dynamicRef": "#meta"}
    }
  },
  "$defs": {
    "anchorString": {
      "type": "string",
      "pattern": "^[A-Za-z_][-A-Za-z0-9._]*$"
    },
    "uriString": {
      "type": "string",
      "format": "uri"
    },
    "uriReferenceString": {
      "type": "string",
      "format": "uri-reference"
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/format-annotation",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/format-annotation": true
  },
  "$dynamicAnchor": "meta",

  "title": "Format vocabulary meta-schema for annotation results",
  "type": ["object", "boolean"],
  "properties": {
    "format": {"type": "string"}
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/meta-data",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/meta-data": true
  },
  "$dynamicAnchor": "meta",

  "title": "Meta-data vocabulary meta-schema",

  "type": ["object", "boolean"],
  "properties": {
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "default": true,
    "deprecated": {
      "type": "boolean",
      "default": false
    },
    "readOnly": {
      "type": "boolean",
      "default": false
    },
    "writeOnly": {
      "type": "boolean",
      "default": false
    },
    "examples": {
      "type": "array",
      "items": true
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/unevaluated",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/unevaluated": true
  },
  "$dynamicAnchor": "meta",

  "title": "Unevaluated applicator vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "unevaluatedItems": {"$dynamicRef": "#meta"},
    "unevaluatedProperties": {"$dynamicRef": "#meta"}
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/meta/validation",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/validation": true
  },
  "$dynamicAnchor": "meta",

  "title": "Validation vocabulary meta-schema",
  "type": ["object", "boolean"],
  "properties": {
    "type": {
      "anyOf": [
        {"$ref": "#/$defs/simpleTypes"},
        {
          "type": "array",
          "items": {"$ref": "#/$defs/simpleTypes"},
          "minItems": 1,
          "uniqueItems": true
        }
      ]
    },
    "const": true,
    "enum": {
      "type": "array",
      "items": true
    },
    "multipleOf": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "maximum": {
      "type": "number"
    },
    "exclusiveMaximum": {
      "type": "number"
    },
    "minimum": {
      "type": "number"
    },
    "exclusiveMinimum": {
      "type": "number"
    },
    "maxLength": {"$ref": "#/$defs/nonNegativeInteger"},
    "minLength": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "pattern": {
      "type": "string",
      "format": "regex"
    },
    "maxItems": {"$ref": "#/$defs/nonNegativeInteger"},
    "minItems": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "uniqueItems": {
      "type": "boolean",
      "default": false
    },
    "maxContains": {"$ref": "#/$defs/nonNegativeInteger"},
    "minContains": {
      "$ref": "#/$defs/nonNegativeInteger",
      "default": 1
    },
    "maxProperties": {"$ref": "#/$defs/nonNegativeInteger"},
    "minProperties": {"$ref": "#/$defs/nonNegativeIntegerDefault0"},
    "required": {"$ref": "#/$defs/stringArray"},
    "dependentRequired": {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/$defs/stringArray"
      }
    }
  },
  "$defs": {
    "nonNegativeInteger": {
      "type": "integer",
      "minimum": 0
    },
    "nonNegativeIntegerDefault0": {
      "$ref": "#/$defs/nonNegativeInteger",
      "default": 0
    },
    "simpleTypes": {
      "enum": ["array", "boolean", "integer", "null", "number", "object", "string"]
    },
    "stringArray": {
      "type": "array",
      "items": {"type": "string"},
      "uniqueItems": true,
      "default": []
    }
  }
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/schema",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/core": true,
    "https://json-schema.org/draft/2020-12/vocab/applicator": true,
    "https://json-schema.org/draft/2020-12/vocab/unevaluated": true,
    "https://json-schema.org/draft/2020-12/vocab/validation": true,
    "https://json-schema.org/draft/2020-12/vocab/meta-data": true,
    "https://json-schema.org/draft/2020-12/vocab/format-annotation": true,
    "https://json-schema.org/draft/2020-12/vocab/content": true
  },
  "$dynamicAnchor": "meta",

  "title": "Core and Validation specifications meta-schema",
  "allOf": [
    {"$ref": "meta/core"},
    {"$ref": "meta/applicator"},
    {"$ref": "meta/unevaluated"},
    {"$ref": "meta/validation"},
    {"$ref": "meta/meta-data"},
    {"$ref": "meta/format-annotation"},
    {"$ref": "meta/content"}
  ],
  "type": ["object", "boolean"],
  "$comment": "This meta-schema also defines keywords that have appeared in previous drafts in order to prevent incompatible extensions as they remain in common use.",
  "properties": {
    "definitions": {
      "$comment": "\"definitions\" has been replaced by \"$defs\".",
      "type": "object",
      "additionalProperties": {"$dynamicRef": "#meta"},
      "deprecated": true,
      "default": {}
    },
    "dependencies": {
      "$comment": "\"dependencies\" has been split and replaced by \"dependentSchemas\" and \"dependentRequired\" in order to serve their differing semantics.",
      "type": "object",
      "additionalProperties": {
        "anyOf": [{"$dynamicRef": "#meta"}, {"$ref": "meta/validation#/$defs/stringArray"}]
      },
      "deprecated": true,
      "default": {}
    },
    "$recursiveAnchor": {
      "$comment": "\"$recursiveAnchor\" has been replaced by \"$dynamicAnchor\".",
      "$ref": "meta/core#/$defs/anchorString",
      "deprecated": true
    },
    "$recursiveRef": {
      "$comment": "\"$recursiveRef\" has been replaced by \"$dynamicRef\".",
      "$ref": "meta/core#/$defs/uriReferenceString",
      "deprecated": true
    }
  }
}
{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "$id": "http://json-schema.org/draft-06/schema#",
  "title": "Core schema meta-schema",
  "definitions": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$ref": "#"}
    },
    "nonNegativeInteger": {
      "type": "integer",
      "minimum": 0
    },
    "nonNegativeIntegerDefault0": {
      "allOf": [{"$ref": "#/definitions/nonNegativeInteger"}, {"default": 0}]
    },
    "simpleTypes": {
      "enum": ["array", "boolean", "integer", "null", "number", "object", "string"]
    },
    "stringArray": {
      "type": "array",
      "items": {"type": "string"},
      "uniqueItems": true,
      "default": []
    }
  },
  "type": ["object", "boolean"],
  "properties": {
    "$id": {
      "type": "string",
      "format": "uri-reference"
    },
    "$schema": {
      "type": "string",
      "format": "uri"
    },
    "$ref": {
      "type": "string",
      "format": "uri-reference"
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "default": {},
    "examples": {
      "type": "array",
      "items": {}
    },
    "multipleOf": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "maximum": {
      "type": "number"
    },
    "exclusiveMaximum": {
      "type": "number"
    },
    "minimum": {
      "type": "number"
    },
    "exclusiveMinimum": {
      "type": "number"
    },
    "maxLength": {"$ref": "#/definitions/nonNegativeInteger"},
    "minLength": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "pattern": {
      "type": "string",
      "format": "regex"
    },
    "additionalItems": {"$ref": "#"},
    "items": {
      "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/schemaArray"}],
      "default": {}
    },
    "maxItems": {"$ref": "#/definitions/nonNegativeInteger"},
    "minItems": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "uniqueItems": {
      "type": "boolean",
      "default": false
    },
    "contains": {"$ref": "#"},
    "maxProperties": {"$ref": "#/definitions/nonNegativeInteger"},
    "minProperties": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "required": {"$ref": "#/definitions/stringArray"},
    "additionalProperties": {"$ref": "#"},
    "definitions": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "default": {}
    },
    "properties": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "default": {}
    },
    "patternProperties": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "default": {}
    },
    "dependencies": {
      "type": "object",
      "additionalProperties": {
        "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/stringArray"}]
      }
    },
    "propertyNames": {"$ref": "#"},
    "const": {},
    "enum": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true
    },
    "type": {
      "anyOf": [
        {"$ref": "#/definitions/simpleTypes"},
        {
          "type": "array",
          "items": {"$ref": "#/definitions/simpleTypes"},
          "minItems": 1,
          "uniqueItems": true
        }
      ]
    },
    "format": {"type": "string"},
    "allOf": {"$ref": "#/definitions/schemaArray"},
    "anyOf": {"$ref": "#/definitions/schemaArray"},
    "oneOf": {"$ref": "#/definitions/schemaArray"},
    "not": {"$ref": "#"}
  },
  "default": {}
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://json-schema.org/draft-07/schema#",
  "title": "Core schema meta-schema",
  "definitions": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$ref": "#"}
    },
    "nonNegativeInteger": {
      "type": "integer",
      "minimum": 0
    },
    "nonNegativeIntegerDefault0": {
      "allOf": [{"$ref": "#/definitions/nonNegativeInteger"}, {"default": 0}]
    },
    "simpleTypes": {
      "enum": ["array", "boolean", "integer", "null", "number", "object", "string"]
    },
    "stringArray": {
      "type": "array",
      "items": {"type": "string"},
      "uniqueItems": true,
      "default": []
    }
  },
  "type": ["object", "boolean"],
  "properties": {
    "$id": {
      "type": "string",
      "format": "uri-reference"
    },
    "$schema": {
      "type": "string",
      "format": "uri"
    },
    "$ref": {
      "type": "string",
      "format": "uri-reference"
    },
    "$comment": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "default": true,
    "readOnly": {
      "type": "boolean",
      "default": false
    },
    "examples": {
      "type": "array",
      "items": true
    },
    "multipleOf": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "maximum": {
      "type": "number"
    },
    "exclusiveMaximum": {
      "type": "number"
    },
    "minimum": {
      "type": "number"
    },
    "exclusiveMinimum": {
      "type": "number"
    },
    "maxLength": {"$ref": "#/definitions/nonNegativeInteger"},
    "minLength": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "pattern": {
      "type": "string",
      "format": "regex"
    },
    "additionalItems": {"$ref": "#"},
    "items": {
      "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/schemaArray"}],
      "default": true
    },
    "maxItems": {"$ref": "#/definitions/nonNegativeInteger"},
    "minItems": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "uniqueItems": {
      "type": "boolean",
      "default": false
    },
    "contains": {"$ref": "#"},
    "maxProperties": {"$ref": "#/definitions/nonNegativeInteger"},
    "minProperties": {"$ref": "#/definitions/nonNegativeIntegerDefault0"},
    "required": {"$ref": "#/definitions/stringArray"},
    "additionalProperties": {"$ref": "#"},
    "definitions": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "default": {}
    },
    "properties": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "default": {}
    },
    "patternProperties": {
      "type": "object",
      "additionalProperties": {"$ref": "#"},
      "propertyNames": {"format": "regex"},
      "default": {}
    },
    "dependencies": {
      "type": "object",
      "additionalProperties": {
        "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/stringArray"}]
      }
    },
    "propertyNames": {"$ref": "#"},
    "const": true,
    "enum": {
      "type": "array",
      "items": true,
      "minItems": 1,
      "uniqueItems": true
    },
    "type": {
      "anyOf": [
        {"$ref": "#/definitions/simpleTypes"},
        {
          "type": "array",
          "items": {"$ref": "#/definitions/simpleTypes"},
          "minItems": 1,
          "uniqueItems": true
        }
      ]
    },
    "format": {"type": "string"},
    "contentMediaType": {"type": "string"},
    "contentEncoding": {"type": "string"},
    "if": {"$ref": "#"},
    "then": {"$ref": "#"},
    "else": {"$ref": "#"},
    "allOf": {"$ref": "#/definitions/schemaArray"},
    "anyOf": {"$ref": "#/definitions/schemaArray"},
    "oneOf": {"$ref": "#/definitions/schemaArray"},
    "not": {"$ref": "#"}
  },
  "default": true
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/json-schema-secure.json#",
  "title": "Meta-schema for the security assessment of JSON Schemas",
  "description": "If a JSON AnySchema fails validation against this meta-schema, it may be unsafe to validate untrusted data",
  "definitions": {
    "schemaArray": {
      "type": "array",
      "minItems": 1,
      "items": {"$ref": "#"}
    }
  },
  "dependencies": {
    "patternProperties": {
      "description": "prevent slow validation of large property names",
      "required": ["propertyNames"],
      "properties": {
        "propertyNames": {
          "required": ["maxLength"]
        }
      }
    },
    "uniqueItems": {
      "description": "prevent slow validation of large non-scalar arrays",
      "if": {
        "properties": {
          "uniqueItems": {"const": true},
          "items": {
            "properties": {
              "type": {
                "anyOf": [
                  {
                    "enum": ["object", "array"]
                  },
                  {
                    "type": "array",
                    "contains": {"enum": ["object", "array"]}
                  }
                ]
              }
            }
          }
        }
      },
      "then": {
        "required": ["maxItems"]
      }
    },
    "pattern": {
      "description": "prevent slow pattern matching of large strings",
      "required": ["maxLength"]
    },
    "format": {
      "description": "prevent slow format validation of large strings",
      "required": ["maxLength"]
    }
  },
  "properties": {
    "additionalItems": {"$ref": "#"},
    "additionalProperties": {"$ref": "#"},
    "dependencies": {
      "additionalProperties": {
        "anyOf": [{"type": "array"}, {"$ref": "#"}]
      }
    },
    "items": {
      "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/schemaArray"}]
    },
    "definitions": {
      "additionalProperties": {"$ref": "#"}
    },
    "patternProperties": {
      "additionalProperties": {"$ref": "#"}
    },
    "properties": {
      "additionalProperties": {"$ref": "#"}
    },
    "if": {"$ref": "#"},
    "then": {"$ref": "#"},
    "else": {"$ref": "#"},
    "allOf": {"$ref": "#/definitions/schemaArray"},
    "anyOf": {"$ref": "#/definitions/schemaArray"},
    "oneOf": {"$ref": "#/definitions/schemaArray"},
    "not": {"$ref": "#"},
    "contains": {"$ref": "#"},
    "propertyNames": {"$ref": "#"}
  }
}
{
  "name": "ajv",
  "version": "8.18.0",
  "description": "Another JSON Schema Validator",
  "main": "dist/ajv.js",
  "types": "dist/ajv.d.ts",
  "files": [
    "lib/",
    "dist/",
    ".runkit_example.js"
  ],
  "sideEffects": false,
  "repository": "ajv-validator/ajv",
  "author": "Evgeny Poberezkin",
  "license": "MIT",
  "homepage": "https://ajv.js.org",
  "runkitExampleFilename": ".runkit_example.js",
  "dependencies": {
    "fast-deep-equal": "^3.1.3",
    "fast-uri": "^3.0.1",
    "json-schema-traverse": "^1.0.0",
    "require-from-string": "^2.0.2"
  },
  "devDependencies": {
    "@ajv-validator/config": "^0.5.0",
    "@rollup/plugin-commonjs": "^25.0.7",
    "@rollup/plugin-json": "^6.1.0",
    "@rollup/plugin-node-resolve": "^15.2.3",
    "@rollup/plugin-typescript": "^11.1.6",
    "@types/chai": "^4.3.11",
    "@types/mocha": "^10.0.6",
    "@types/node": "^20.11.30",
    "@types/require-from-string": "^1.2.3",
    "@typescript-eslint/eslint-plugin": "^7.3.1",
    "@typescript-eslint/parser": "^7.3.1",
    "ajv-formats": "^3.0.1",
    "browserify": "^17.0.0",
    "chai": "^4.4.1",
    "cross-env": "^7.0.3",
    "dayjs": "^1.11.10",
    "dayjs-plugin-utc": "^0.1.2",
    "eslint": "^8.57.0",
    "eslint-config-prettier": "^9.1.0",
    "glob": "^10.3.10",
    "husky": "^9.0.11",
    "if-node-version": "^1.1.1",
    "jimp": "^0.22.10",
    "js-beautify": "^1.15.1",
    "json-schema-test": "^2.0.0",
    "karma": "^6.4.2",
    "karma-chrome-launcher": "^3.2.0",
    "karma-mocha": "^2.0.1",
    "lint-staged": "^15.2.2",
    "mocha": "^10.3.0",
    "module-from-string": "^3.3.0",
    "node-fetch": "^3.3.2",
    "nyc": "^15.1.0",
    "prettier": "3.0.3",
    "re2": "^1.20.9",
    "rollup": "^2.79.1",
    "rollup-plugin-terser": "^7.0.2",
    "ts-node": "^10.9.2",
    "tsify": "^5.0.4",
    "typescript": "5.3.3",
    "uri-js": "^4.4.1"
  },
  "collective": {
    "type": "opencollective",
    "url": "https://opencollective.com/ajv"
  },
  "funding": {
    "type": "github",
    "url": "https://github.com/sponsors/epoberezkin"
  },
  "prettier": "@ajv-validator/config/prettierrc.json",
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged && npm test"
    }
  },
  "lint-staged": {
    "*.{json,yaml,js,ts}": "prettier --write"
  }
}MIT License

Copyright (c) 2020 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatNames = exports.fastFormats = exports.fullFormats = void 0;
function fmtDef(validate, compare) {
    return { validate, compare };
}
exports.fullFormats = {
    // date: http://tools.ietf.org/html/rfc3339#section-5.6
    date: fmtDef(date, compareDate),
    // date-time: http://tools.ietf.org/html/rfc3339#section-5.6
    time: fmtDef(time, compareTime),
    "date-time": fmtDef(date_time, compareDateTime),
    // duration: https://tools.ietf.org/html/rfc3339#appendix-A
    duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/,
    uri,
    "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,
    // uri-template: https://tools.ietf.org/html/rfc6570
    "uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,
    // For the source: https://gist.github.com/dperini/729294
    // For test cases: https://mathiasbynens.be/demo/url-regex
    url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu,
    email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,
    hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i,
    // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html
    ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,
    ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i,
    regex,
    // uuid: http://tools.ietf.org/html/rfc4122
    uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,
    // JSON-pointer: https://tools.ietf.org/html/rfc6901
    // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A
    "json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/,
    "json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,
    // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00
    "relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/,
    // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types
    // byte: https://github.com/miguelmota/is-base64
    byte,
    // signed 32 bit integer
    int32: { type: "number", validate: validateInt32 },
    // signed 64 bit integer
    int64: { type: "number", validate: validateInt64 },
    // C-type float
    float: { type: "number", validate: validateNumber },
    // C-type double
    double: { type: "number", validate: validateNumber },
    // hint to the UI to hide input strings
    password: true,
    // unchecked string payload
    binary: true,
};
exports.fastFormats = {
    ...exports.fullFormats,
    date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate),
    time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareTime),
    "date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime),
    // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js
    uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,
    "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,
    // email (sources from jsen validator):
    // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363
    // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation')
    email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,
};
exports.formatNames = Object.keys(exports.fullFormats);
function isLeapYear(year) {
    // https://tools.ietf.org/html/rfc3339#appendix-C
    return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}
const DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/;
const DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
function date(str) {
    // full-date from http://tools.ietf.org/html/rfc3339#section-5.6
    const matches = DATE.exec(str);
    if (!matches)
        return false;
    const year = +matches[1];
    const month = +matches[2];
    const day = +matches[3];
    return (month >= 1 &&
        month <= 12 &&
        day >= 1 &&
        day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]));
}
function compareDate(d1, d2) {
    if (!(d1 && d2))
        return undefined;
    if (d1 > d2)
        return 1;
    if (d1 < d2)
        return -1;
    return 0;
}
const TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i;
function time(str, withTimeZone) {
    const matches = TIME.exec(str);
    if (!matches)
        return false;
    const hour = +matches[1];
    const minute = +matches[2];
    const second = +matches[3];
    const timeZone = matches[5];
    return (((hour <= 23 && minute <= 59 && second <= 59) ||
        (hour === 23 && minute === 59 && second === 60)) &&
        (!withTimeZone || timeZone !== ""));
}
function compareTime(t1, t2) {
    if (!(t1 && t2))
        return undefined;
    const a1 = TIME.exec(t1);
    const a2 = TIME.exec(t2);
    if (!(a1 && a2))
        return undefined;
    t1 = a1[1] + a1[2] + a1[3] + (a1[4] || "");
    t2 = a2[1] + a2[2] + a2[3] + (a2[4] || "");
    if (t1 > t2)
        return 1;
    if (t1 < t2)
        return -1;
    return 0;
}
const DATE_TIME_SEPARATOR = /t|\s/i;
function date_time(str) {
    // http://tools.ietf.org/html/rfc3339#section-5.6
    const dateTime = str.split(DATE_TIME_SEPARATOR);
    return dateTime.length === 2 && date(dateTime[0]) && time(dateTime[1], true);
}
function compareDateTime(dt1, dt2) {
    if (!(dt1 && dt2))
        return undefined;
    const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR);
    const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR);
    const res = compareDate(d1, d2);
    if (res === undefined)
        return undefined;
    return res || compareTime(t1, t2);
}
const NOT_URI_FRAGMENT = /\/|:/;
const URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
function uri(str) {
    // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "."
    return NOT_URI_FRAGMENT.test(str) && URI.test(str);
}
const BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm;
function byte(str) {
    BYTE.lastIndex = 0;
    return BYTE.test(str);
}
const MIN_INT32 = -(2 ** 31);
const MAX_INT32 = 2 ** 31 - 1;
function validateInt32(value) {
    return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32;
}
function validateInt64(value) {
    // JSON and javascript max Int is 2**53, so any int that passes isInteger is valid for Int64
    return Number.isInteger(value);
}
function validateNumber() {
    return true;
}
const Z_ANCHOR = /[^\\]\\Z/;
function regex(str) {
    if (Z_ANCHOR.test(str))
        return false;
    try {
        new RegExp(str);
        return true;
    }
    catch (e) {
        return false;
    }
}
//# sourceMappingURL=formats.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const formats_1 = require("./formats");
const limit_1 = require("./limit");
const codegen_1 = require("ajv/dist/compile/codegen");
const fullName = new codegen_1.Name("fullFormats");
const fastName = new codegen_1.Name("fastFormats");
const formatsPlugin = (ajv, opts = { keywords: true }) => {
    if (Array.isArray(opts)) {
        addFormats(ajv, opts, formats_1.fullFormats, fullName);
        return ajv;
    }
    const [formats, exportName] = opts.mode === "fast" ? [formats_1.fastFormats, fastName] : [formats_1.fullFormats, fullName];
    const list = opts.formats || formats_1.formatNames;
    addFormats(ajv, list, formats, exportName);
    if (opts.keywords)
        limit_1.default(ajv);
    return ajv;
};
formatsPlugin.get = (name, mode = "full") => {
    const formats = mode === "fast" ? formats_1.fastFormats : formats_1.fullFormats;
    const f = formats[name];
    if (!f)
        throw new Error(`Unknown format "${name}"`);
    return f;
};
function addFormats(ajv, list, fs, exportName) {
    var _a;
    var _b;
    (_a = (_b = ajv.opts.code).formats) !== null && _a !== void 0 ? _a : (_b.formats = codegen_1._ `require("ajv-formats/dist/formats").${exportName}`);
    for (const f of list)
        ajv.addFormat(f, fs[f]);
}
module.exports = exports = formatsPlugin;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = formatsPlugin;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatLimitDefinition = void 0;
const ajv_1 = require("ajv");
const codegen_1 = require("ajv/dist/compile/codegen");
const ops = codegen_1.operators;
const KWDs = {
    formatMaximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT },
    formatMinimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT },
    formatExclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE },
    formatExclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE },
};
const error = {
    message: ({ keyword, schemaCode }) => codegen_1.str `should be ${KWDs[keyword].okStr} ${schemaCode}`,
    params: ({ keyword, schemaCode }) => codegen_1._ `{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}`,
};
exports.formatLimitDefinition = {
    keyword: Object.keys(KWDs),
    type: "string",
    schemaType: "string",
    $data: true,
    error,
    code(cxt) {
        const { gen, data, schemaCode, keyword, it } = cxt;
        const { opts, self } = it;
        if (!opts.validateFormats)
            return;
        const fCxt = new ajv_1.KeywordCxt(it, self.RULES.all.format.definition, "format");
        if (fCxt.$data)
            validate$DataFormat();
        else
            validateFormat();
        function validate$DataFormat() {
            const fmts = gen.scopeValue("formats", {
                ref: self.formats,
                code: opts.code.formats,
            });
            const fmt = gen.const("fmt", codegen_1._ `${fmts}[${fCxt.schemaCode}]`);
            cxt.fail$data(codegen_1.or(codegen_1._ `typeof ${fmt} != "object"`, codegen_1._ `${fmt} instanceof RegExp`, codegen_1._ `typeof ${fmt}.compare != "function"`, compareCode(fmt)));
        }
        function validateFormat() {
            const format = fCxt.schema;
            const fmtDef = self.formats[format];
            if (!fmtDef || fmtDef === true)
                return;
            if (typeof fmtDef != "object" ||
                fmtDef instanceof RegExp ||
                typeof fmtDef.compare != "function") {
                throw new Error(`"${keyword}": format "${format}" does not define "compare" function`);
            }
            const fmt = gen.scopeValue("formats", {
                key: format,
                ref: fmtDef,
                code: opts.code.formats ? codegen_1._ `${opts.code.formats}${codegen_1.getProperty(format)}` : undefined,
            });
            cxt.fail$data(compareCode(fmt));
        }
        function compareCode(fmt) {
            return codegen_1._ `${fmt}.compare(${data}, ${schemaCode}) ${KWDs[keyword].fail} 0`;
        }
    },
    dependencies: ["format"],
};
const formatLimitPlugin = (ajv) => {
    ajv.addKeyword(exports.formatLimitDefinition);
    return ajv;
};
exports.default = formatLimitPlugin;
//# sourceMappingURL=limit.js.map{
  "name": "ajv-formats",
  "version": "2.1.1",
  "description": "Format validation for Ajv v7+",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "files": [
    "src/",
    "dist/"
  ],
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ajv-validator/ajv-formats.git"
  },
  "author": "Evgeny Poberezkin",
  "license": "MIT",
  "homepage": "https://github.com/ajv-validator/ajv-formats#readme",
  "dependencies": {
    "ajv": "^8.0.0"
  },
  "peerDependencies": {
    "ajv": "^8.0.0"
  },
  "peerDependenciesMeta": {
    "ajv": {
      "optional": true
    }
  },
  "devDependencies": {
    "@ajv-validator/config": "^0.3.0",
    "@types/jest": "^26.0.5",
    "@types/node": "^14.10.1",
    "@typescript-eslint/eslint-plugin": "^3.7.0",
    "@typescript-eslint/parser": "^3.7.0",
    "ajv": "^8.0.0",
    "eslint": "^7.5.0",
    "eslint-config-prettier": "^6.11.0",
    "husky": "^4.2.5",
    "jest": "^26.1.0",
    "json-schema-test": "^2.0.0",
    "lint-staged": "^10.2.11",
    "prettier": "^2.3.2",
    "ts-jest": "^26.1.3",
    "typescript": "^4.0.0"
  },
  "prettier": "@ajv-validator/config/prettierrc.json",
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged && npm test"
    }
  },
  "lint-staged": {
    "*.{md,json,yaml,js,ts}": "prettier --write"
  }
}
root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false
v10.12.0
The MIT License (MIT)

Copyright (c) 2020-present Fabio Spampinato

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
"use strict";
/* CONSTS */
Object.defineProperty(exports, "__esModule", { value: true });
exports.NOOP = exports.LIMIT_FILES_DESCRIPTORS = exports.LIMIT_BASENAME_LENGTH = exports.IS_USER_ROOT = exports.IS_POSIX = exports.DEFAULT_TIMEOUT_SYNC = exports.DEFAULT_TIMEOUT_ASYNC = exports.DEFAULT_WRITE_OPTIONS = exports.DEFAULT_READ_OPTIONS = exports.DEFAULT_FOLDER_MODE = exports.DEFAULT_FILE_MODE = exports.DEFAULT_ENCODING = void 0;
const DEFAULT_ENCODING = 'utf8';
exports.DEFAULT_ENCODING = DEFAULT_ENCODING;
const DEFAULT_FILE_MODE = 0o666;
exports.DEFAULT_FILE_MODE = DEFAULT_FILE_MODE;
const DEFAULT_FOLDER_MODE = 0o777;
exports.DEFAULT_FOLDER_MODE = DEFAULT_FOLDER_MODE;
const DEFAULT_READ_OPTIONS = {};
exports.DEFAULT_READ_OPTIONS = DEFAULT_READ_OPTIONS;
const DEFAULT_WRITE_OPTIONS = {};
exports.DEFAULT_WRITE_OPTIONS = DEFAULT_WRITE_OPTIONS;
const DEFAULT_TIMEOUT_ASYNC = 5000;
exports.DEFAULT_TIMEOUT_ASYNC = DEFAULT_TIMEOUT_ASYNC;
const DEFAULT_TIMEOUT_SYNC = 100;
exports.DEFAULT_TIMEOUT_SYNC = DEFAULT_TIMEOUT_SYNC;
const IS_POSIX = !!process.getuid;
exports.IS_POSIX = IS_POSIX;
const IS_USER_ROOT = process.getuid ? !process.getuid() : false;
exports.IS_USER_ROOT = IS_USER_ROOT;
const LIMIT_BASENAME_LENGTH = 128; //TODO: fetch the real limit from the filesystem //TODO: fetch the whole-path length limit too
exports.LIMIT_BASENAME_LENGTH = LIMIT_BASENAME_LENGTH;
const LIMIT_FILES_DESCRIPTORS = 10000; //TODO: fetch the real limit from the filesystem
exports.LIMIT_FILES_DESCRIPTORS = LIMIT_FILES_DESCRIPTORS;
const NOOP = () => { };
exports.NOOP = NOOP;
"use strict";
/* IMPORT */
Object.defineProperty(exports, "__esModule", { value: true });
exports.writeFileSync = exports.writeFile = exports.readFileSync = exports.readFile = void 0;
const path = require("path");
const consts_1 = require("./consts");
const fs_1 = require("./utils/fs");
const lang_1 = require("./utils/lang");
const scheduler_1 = require("./utils/scheduler");
const temp_1 = require("./utils/temp");
function readFile(filePath, options = consts_1.DEFAULT_READ_OPTIONS) {
    var _a;
    if (lang_1.default.isString(options))
        return readFile(filePath, { encoding: options });
    const timeout = Date.now() + ((_a = options.timeout) !== null && _a !== void 0 ? _a : consts_1.DEFAULT_TIMEOUT_ASYNC);
    return fs_1.default.readFileRetry(timeout)(filePath, options);
}
exports.readFile = readFile;
;
function readFileSync(filePath, options = consts_1.DEFAULT_READ_OPTIONS) {
    var _a;
    if (lang_1.default.isString(options))
        return readFileSync(filePath, { encoding: options });
    const timeout = Date.now() + ((_a = options.timeout) !== null && _a !== void 0 ? _a : consts_1.DEFAULT_TIMEOUT_SYNC);
    return fs_1.default.readFileSyncRetry(timeout)(filePath, options);
}
exports.readFileSync = readFileSync;
;
const writeFile = (filePath, data, options, callback) => {
    if (lang_1.default.isFunction(options))
        return writeFile(filePath, data, consts_1.DEFAULT_WRITE_OPTIONS, options);
    const promise = writeFileAsync(filePath, data, options);
    if (callback)
        promise.then(callback, callback);
    return promise;
};
exports.writeFile = writeFile;
const writeFileAsync = async (filePath, data, options = consts_1.DEFAULT_WRITE_OPTIONS) => {
    var _a;
    if (lang_1.default.isString(options))
        return writeFileAsync(filePath, data, { encoding: options });
    const timeout = Date.now() + ((_a = options.timeout) !== null && _a !== void 0 ? _a : consts_1.DEFAULT_TIMEOUT_ASYNC);
    let schedulerCustomDisposer = null, schedulerDisposer = null, tempDisposer = null, tempPath = null, fd = null;
    try {
        if (options.schedule)
            schedulerCustomDisposer = await options.schedule(filePath);
        schedulerDisposer = await scheduler_1.default.schedule(filePath);
        filePath = await fs_1.default.realpathAttempt(filePath) || filePath;
        [tempPath, tempDisposer] = temp_1.default.get(filePath, options.tmpCreate || temp_1.default.create, !(options.tmpPurge === false));
        const useStatChown = consts_1.IS_POSIX && lang_1.default.isUndefined(options.chown), useStatMode = lang_1.default.isUndefined(options.mode);
        if (useStatChown || useStatMode) {
            const stat = await fs_1.default.statAttempt(filePath);
            if (stat) {
                options = { ...options };
                if (useStatChown)
                    options.chown = { uid: stat.uid, gid: stat.gid };
                if (useStatMode)
                    options.mode = stat.mode;
            }
        }
        const parentPath = path.dirname(filePath);
        await fs_1.default.mkdirAttempt(parentPath, {
            mode: consts_1.DEFAULT_FOLDER_MODE,
            recursive: true
        });
        fd = await fs_1.default.openRetry(timeout)(tempPath, 'w', options.mode || consts_1.DEFAULT_FILE_MODE);
        if (options.tmpCreated)
            options.tmpCreated(tempPath);
        if (lang_1.default.isString(data)) {
            await fs_1.default.writeRetry(timeout)(fd, data, 0, options.encoding || consts_1.DEFAULT_ENCODING);
        }
        else if (!lang_1.default.isUndefined(data)) {
            await fs_1.default.writeRetry(timeout)(fd, data, 0, data.length, 0);
        }
        if (options.fsync !== false) {
            if (options.fsyncWait !== false) {
                await fs_1.default.fsyncRetry(timeout)(fd);
            }
            else {
                fs_1.default.fsyncAttempt(fd);
            }
        }
        await fs_1.default.closeRetry(timeout)(fd);
        fd = null;
        if (options.chown)
            await fs_1.default.chownAttempt(tempPath, options.chown.uid, options.chown.gid);
        if (options.mode)
            await fs_1.default.chmodAttempt(tempPath, options.mode);
        try {
            await fs_1.default.renameRetry(timeout)(tempPath, filePath);
        }
        catch (error) {
            if (error.code !== 'ENAMETOOLONG')
                throw error;
            await fs_1.default.renameRetry(timeout)(tempPath, temp_1.default.truncate(filePath));
        }
        tempDisposer();
        tempPath = null;
    }
    finally {
        if (fd)
            await fs_1.default.closeAttempt(fd);
        if (tempPath)
            temp_1.default.purge(tempPath);
        if (schedulerCustomDisposer)
            schedulerCustomDisposer();
        if (schedulerDisposer)
            schedulerDisposer();
    }
};
const writeFileSync = (filePath, data, options = consts_1.DEFAULT_WRITE_OPTIONS) => {
    var _a;
    if (lang_1.default.isString(options))
        return writeFileSync(filePath, data, { encoding: options });
    const timeout = Date.now() + ((_a = options.timeout) !== null && _a !== void 0 ? _a : consts_1.DEFAULT_TIMEOUT_SYNC);
    let tempDisposer = null, tempPath = null, fd = null;
    try {
        filePath = fs_1.default.realpathSyncAttempt(filePath) || filePath;
        [tempPath, tempDisposer] = temp_1.default.get(filePath, options.tmpCreate || temp_1.default.create, !(options.tmpPurge === false));
        const useStatChown = consts_1.IS_POSIX && lang_1.default.isUndefined(options.chown), useStatMode = lang_1.default.isUndefined(options.mode);
        if (useStatChown || useStatMode) {
            const stat = fs_1.default.statSyncAttempt(filePath);
            if (stat) {
                options = { ...options };
                if (useStatChown)
                    options.chown = { uid: stat.uid, gid: stat.gid };
                if (useStatMode)
                    options.mode = stat.mode;
            }
        }
        const parentPath = path.dirname(filePath);
        fs_1.default.mkdirSyncAttempt(parentPath, {
            mode: consts_1.DEFAULT_FOLDER_MODE,
            recursive: true
        });
        fd = fs_1.default.openSyncRetry(timeout)(tempPath, 'w', options.mode || consts_1.DEFAULT_FILE_MODE);
        if (options.tmpCreated)
            options.tmpCreated(tempPath);
        if (lang_1.default.isString(data)) {
            fs_1.default.writeSyncRetry(timeout)(fd, data, 0, options.encoding || consts_1.DEFAULT_ENCODING);
        }
        else if (!lang_1.default.isUndefined(data)) {
            fs_1.default.writeSyncRetry(timeout)(fd, data, 0, data.length, 0);
        }
        if (options.fsync !== false) {
            if (options.fsyncWait !== false) {
                fs_1.default.fsyncSyncRetry(timeout)(fd);
            }
            else {
                fs_1.default.fsyncAttempt(fd);
            }
        }
        fs_1.default.closeSyncRetry(timeout)(fd);
        fd = null;
        if (options.chown)
            fs_1.default.chownSyncAttempt(tempPath, options.chown.uid, options.chown.gid);
        if (options.mode)
            fs_1.default.chmodSyncAttempt(tempPath, options.mode);
        try {
            fs_1.default.renameSyncRetry(timeout)(tempPath, filePath);
        }
        catch (error) {
            if (error.code !== 'ENAMETOOLONG')
                throw error;
            fs_1.default.renameSyncRetry(timeout)(tempPath, temp_1.default.truncate(filePath));
        }
        tempDisposer();
        tempPath = null;
    }
    finally {
        if (fd)
            fs_1.default.closeSyncAttempt(fd);
        if (tempPath)
            temp_1.default.purge(tempPath);
    }
};
exports.writeFileSync = writeFileSync;
"use strict";
/* TYPES */
Object.defineProperty(exports, "__esModule", { value: true });
"use strict";
/* IMPORT */
Object.defineProperty(exports, "__esModule", { value: true });
exports.attemptifySync = exports.attemptifyAsync = void 0;
const consts_1 = require("../consts");
/* ATTEMPTIFY */
//TODO: Maybe publish this as a standalone package
//FIXME: The type castings here aren't exactly correct
const attemptifyAsync = (fn, onError = consts_1.NOOP) => {
    return function () {
        return fn.apply(undefined, arguments).catch(onError);
    };
};
exports.attemptifyAsync = attemptifyAsync;
const attemptifySync = (fn, onError = consts_1.NOOP) => {
    return function () {
        try {
            return fn.apply(undefined, arguments);
        }
        catch (error) {
            return onError(error);
        }
    };
};
exports.attemptifySync = attemptifySync;
"use strict";
/* IMPORT */
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const util_1 = require("util");
const attemptify_1 = require("./attemptify");
const fs_handlers_1 = require("./fs_handlers");
const retryify_1 = require("./retryify");
/* FS */
const FS = {
    chmodAttempt: attemptify_1.attemptifyAsync(util_1.promisify(fs.chmod), fs_handlers_1.default.onChangeError),
    chownAttempt: attemptify_1.attemptifyAsync(util_1.promisify(fs.chown), fs_handlers_1.default.onChangeError),
    closeAttempt: attemptify_1.attemptifyAsync(util_1.promisify(fs.close)),
    fsyncAttempt: attemptify_1.attemptifyAsync(util_1.promisify(fs.fsync)),
    mkdirAttempt: attemptify_1.attemptifyAsync(util_1.promisify(fs.mkdir)),
    realpathAttempt: attemptify_1.attemptifyAsync(util_1.promisify(fs.realpath)),
    statAttempt: attemptify_1.attemptifyAsync(util_1.promisify(fs.stat)),
    unlinkAttempt: attemptify_1.attemptifyAsync(util_1.promisify(fs.unlink)),
    closeRetry: retryify_1.retryifyAsync(util_1.promisify(fs.close), fs_handlers_1.default.isRetriableError),
    fsyncRetry: retryify_1.retryifyAsync(util_1.promisify(fs.fsync), fs_handlers_1.default.isRetriableError),
    openRetry: retryify_1.retryifyAsync(util_1.promisify(fs.open), fs_handlers_1.default.isRetriableError),
    readFileRetry: retryify_1.retryifyAsync(util_1.promisify(fs.readFile), fs_handlers_1.default.isRetriableError),
    renameRetry: retryify_1.retryifyAsync(util_1.promisify(fs.rename), fs_handlers_1.default.isRetriableError),
    statRetry: retryify_1.retryifyAsync(util_1.promisify(fs.stat), fs_handlers_1.default.isRetriableError),
    writeRetry: retryify_1.retryifyAsync(util_1.promisify(fs.write), fs_handlers_1.default.isRetriableError),
    chmodSyncAttempt: attemptify_1.attemptifySync(fs.chmodSync, fs_handlers_1.default.onChangeError),
    chownSyncAttempt: attemptify_1.attemptifySync(fs.chownSync, fs_handlers_1.default.onChangeError),
    closeSyncAttempt: attemptify_1.attemptifySync(fs.closeSync),
    mkdirSyncAttempt: attemptify_1.attemptifySync(fs.mkdirSync),
    realpathSyncAttempt: attemptify_1.attemptifySync(fs.realpathSync),
    statSyncAttempt: attemptify_1.attemptifySync(fs.statSync),
    unlinkSyncAttempt: attemptify_1.attemptifySync(fs.unlinkSync),
    closeSyncRetry: retryify_1.retryifySync(fs.closeSync, fs_handlers_1.default.isRetriableError),
    fsyncSyncRetry: retryify_1.retryifySync(fs.fsyncSync, fs_handlers_1.default.isRetriableError),
    openSyncRetry: retryify_1.retryifySync(fs.openSync, fs_handlers_1.default.isRetriableError),
    readFileSyncRetry: retryify_1.retryifySync(fs.readFileSync, fs_handlers_1.default.isRetriableError),
    renameSyncRetry: retryify_1.retryifySync(fs.renameSync, fs_handlers_1.default.isRetriableError),
    statSyncRetry: retryify_1.retryifySync(fs.statSync, fs_handlers_1.default.isRetriableError),
    writeSyncRetry: retryify_1.retryifySync(fs.writeSync, fs_handlers_1.default.isRetriableError)
};
/* EXPORT */
exports.default = FS;
"use strict";
/* IMPORT */
Object.defineProperty(exports, "__esModule", { value: true });
const consts_1 = require("../consts");
/* FS HANDLERS */
const Handlers = {
    isChangeErrorOk: (error) => {
        const { code } = error;
        if (code === 'ENOSYS')
            return true;
        if (!consts_1.IS_USER_ROOT && (code === 'EINVAL' || code === 'EPERM'))
            return true;
        return false;
    },
    isRetriableError: (error) => {
        const { code } = error;
        if (code === 'EMFILE' || code === 'ENFILE' || code === 'EAGAIN' || code === 'EBUSY' || code === 'EACCESS' || code === 'EACCS' || code === 'EPERM')
            return true;
        return false;
    },
    onChangeError: (error) => {
        if (Handlers.isChangeErrorOk(error))
            return;
        throw error;
    }
};
/* EXPORT */
exports.default = Handlers;
"use strict";
/* LANG */
Object.defineProperty(exports, "__esModule", { value: true });
const Lang = {
    isFunction: (x) => {
        return typeof x === 'function';
    },
    isString: (x) => {
        return typeof x === 'string';
    },
    isUndefined: (x) => {
        return typeof x === 'undefined';
    }
};
/* EXPORT */
exports.default = Lang;
"use strict";
/* IMPORT */
Object.defineProperty(exports, "__esModule", { value: true });
exports.retryifySync = exports.retryifyAsync = void 0;
const retryify_queue_1 = require("./retryify_queue");
/* RETRYIFY */
const retryifyAsync = (fn, isRetriableError) => {
    return function (timestamp) {
        return function attempt() {
            return retryify_queue_1.default.schedule().then(cleanup => {
                return fn.apply(undefined, arguments).then(result => {
                    cleanup();
                    return result;
                }, error => {
                    cleanup();
                    if (Date.now() >= timestamp)
                        throw error;
                    if (isRetriableError(error)) {
                        const delay = Math.round(100 + (400 * Math.random())), delayPromise = new Promise(resolve => setTimeout(resolve, delay));
                        return delayPromise.then(() => attempt.apply(undefined, arguments));
                    }
                    throw error;
                });
            });
        };
    };
};
exports.retryifyAsync = retryifyAsync;
const retryifySync = (fn, isRetriableError) => {
    return function (timestamp) {
        return function attempt() {
            try {
                return fn.apply(undefined, arguments);
            }
            catch (error) {
                if (Date.now() > timestamp)
                    throw error;
                if (isRetriableError(error))
                    return attempt.apply(undefined, arguments);
                throw error;
            }
        };
    };
};
exports.retryifySync = retryifySync;
"use strict";
/* IMPORT */
Object.defineProperty(exports, "__esModule", { value: true });
const consts_1 = require("../consts");
/* RETRYIFY QUEUE */
const RetryfyQueue = {
    interval: 25,
    intervalId: undefined,
    limit: consts_1.LIMIT_FILES_DESCRIPTORS,
    queueActive: new Set(),
    queueWaiting: new Set(),
    init: () => {
        if (RetryfyQueue.intervalId)
            return;
        RetryfyQueue.intervalId = setInterval(RetryfyQueue.tick, RetryfyQueue.interval);
    },
    reset: () => {
        if (!RetryfyQueue.intervalId)
            return;
        clearInterval(RetryfyQueue.intervalId);
        delete RetryfyQueue.intervalId;
    },
    add: (fn) => {
        RetryfyQueue.queueWaiting.add(fn);
        if (RetryfyQueue.queueActive.size < (RetryfyQueue.limit / 2)) { // Active queue not under preassure, executing immediately
            RetryfyQueue.tick();
        }
        else {
            RetryfyQueue.init();
        }
    },
    remove: (fn) => {
        RetryfyQueue.queueWaiting.delete(fn);
        RetryfyQueue.queueActive.delete(fn);
    },
    schedule: () => {
        return new Promise(resolve => {
            const cleanup = () => RetryfyQueue.remove(resolver);
            const resolver = () => resolve(cleanup);
            RetryfyQueue.add(resolver);
        });
    },
    tick: () => {
        if (RetryfyQueue.queueActive.size >= RetryfyQueue.limit)
            return;
        if (!RetryfyQueue.queueWaiting.size)
            return RetryfyQueue.reset();
        for (const fn of RetryfyQueue.queueWaiting) {
            if (RetryfyQueue.queueActive.size >= RetryfyQueue.limit)
                break;
            RetryfyQueue.queueWaiting.delete(fn);
            RetryfyQueue.queueActive.add(fn);
            fn();
        }
    }
};
/* EXPORT */
exports.default = RetryfyQueue;
"use strict";
/* IMPORT */
Object.defineProperty(exports, "__esModule", { value: true });
/* VARIABLES */
const Queues = {};
/* SCHEDULER */
//TODO: Maybe publish this as a standalone package
const Scheduler = {
    next: (id) => {
        const queue = Queues[id];
        if (!queue)
            return;
        queue.shift();
        const job = queue[0];
        if (job) {
            job(() => Scheduler.next(id));
        }
        else {
            delete Queues[id];
        }
    },
    schedule: (id) => {
        return new Promise(resolve => {
            let queue = Queues[id];
            if (!queue)
                queue = Queues[id] = [];
            queue.push(resolve);
            if (queue.length > 1)
                return;
            resolve(() => Scheduler.next(id));
        });
    }
};
/* EXPORT */
exports.default = Scheduler;
"use strict";
/* IMPORT */
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const consts_1 = require("../consts");
const fs_1 = require("./fs");
/* TEMP */
//TODO: Maybe publish this as a standalone package
const Temp = {
    store: {},
    create: (filePath) => {
        const randomness = `000000${Math.floor(Math.random() * 16777215).toString(16)}`.slice(-6), // 6 random-enough hex characters
        timestamp = Date.now().toString().slice(-10), // 10 precise timestamp digits
        prefix = 'tmp-', suffix = `.${prefix}${timestamp}${randomness}`, tempPath = `${filePath}${suffix}`;
        return tempPath;
    },
    get: (filePath, creator, purge = true) => {
        const tempPath = Temp.truncate(creator(filePath));
        if (tempPath in Temp.store)
            return Temp.get(filePath, creator, purge); // Collision found, try again
        Temp.store[tempPath] = purge;
        const disposer = () => delete Temp.store[tempPath];
        return [tempPath, disposer];
    },
    purge: (filePath) => {
        if (!Temp.store[filePath])
            return;
        delete Temp.store[filePath];
        fs_1.default.unlinkAttempt(filePath);
    },
    purgeSync: (filePath) => {
        if (!Temp.store[filePath])
            return;
        delete Temp.store[filePath];
        fs_1.default.unlinkSyncAttempt(filePath);
    },
    purgeSyncAll: () => {
        for (const filePath in Temp.store) {
            Temp.purgeSync(filePath);
        }
    },
    truncate: (filePath) => {
        const basename = path.basename(filePath);
        if (basename.length <= consts_1.LIMIT_BASENAME_LENGTH)
            return filePath; //FIXME: Rough and quick attempt at detecting ok lengths
        const truncable = /^(\.?)(.*?)((?:\.[^.]+)?(?:\.tmp-\d{10}[a-f0-9]{6})?)$/.exec(basename);
        if (!truncable)
            return filePath; //FIXME: No truncable part detected, can't really do much without also changing the parent path, which is unsafe, hoping for the best here
        const truncationLength = basename.length - consts_1.LIMIT_BASENAME_LENGTH;
        return `${filePath.slice(0, -basename.length)}${truncable[1]}${truncable[2].slice(0, -truncationLength)}${truncable[3]}`; //FIXME: The truncable part might be shorter than needed here
    }
};
/* INIT */
process.on('exit', Temp.purgeSyncAll); // Ensuring purgeable temp files are purged on exit
/* EXPORT */
exports.default = Temp;
{
  "name": "atomically",
  "description": "Read and write files atomically and reliably.",
  "version": "1.7.0",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "license": "MIT",
  "author": {
    "name": "Fabio Spampinato",
    "email": "spampinabio@gmail.com"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/fabiospampinato/atomically.git"
  },
  "engines": {
    "node": ">=10.12.0"
  },
  "dependencies": {},
  "devDependencies": {
    "@types/node": "^12.7.2",
    "lodash": "^4.17.19",
    "mkdirp": "^1.0.4",
    "promise-resolve-timeout": "^1.2.1",
    "require-inject": "^1.4.4",
    "rimraf": "^3.0.2",
    "tap": "^14.10.7",
    "typescript": "^3.5.3",
    "typescript-transform-export-interop": "^1.0.2",
    "write-file-atomic": "^3.0.3"
  }
}
/* IMPORT */

const fs = require ( 'fs' ),
      os = require ( 'os' ),
      path = require ( 'path' ),
      delay = require ( 'promise-resolve-timeout' ),
      writeFileAtomic = require ( 'write-file-atomic' ),
      {writeFile, writeFileSync} = require ( '../dist' );

/* BENCHMARK */

const TEMP = os.tmpdir (),
      DST = i => path.join ( TEMP, `atomically-temp-${i}.txt` ),
      ITERATIONS = 250;

const runSingleAsync = async ( name, fn, buffer, options ) => {
  console.time ( name );
  for ( let i = 0; i < ITERATIONS; i++ ) {
    await fn ( DST ( i ), buffer, options );
  }
  console.timeEnd ( name );
  await delay ( 1000 );
};

const runSingleSync = async ( name, fn, buffer, options ) => {
  console.time ( name );
  for ( let i = 0; i < ITERATIONS; i++ ) {
    fn ( DST ( i ), buffer, options );
  }
  console.timeEnd ( name );
  await delay ( 1000 );
};

const runAllDummy = () => { // Preparation run
  runSingleSync ( 'dummy', fs.writeFileSync, '' );
};

const runAllAsync = async ( name, buffer ) => {
  await runSingleAsync ( `${name} -> async -> write-file-atomic`, writeFileAtomic, buffer );
  await runSingleAsync ( `${name} -> async -> write-file-atomic (fastest)`, writeFileAtomic, buffer, { fsync: false } );
  await runSingleAsync ( `${name} -> async -> atomically`, writeFile, buffer );
  await runSingleAsync ( `${name} -> async -> atomically (faster)`, writeFile, buffer, { mode: false, chown: false, fsyncWait: false } );
  await runSingleAsync ( `${name} -> async -> atomically (fastest)`, writeFile, buffer, { mode: false, chown: false, fsync: false } );
};

const runAllSync = ( name, buffer ) => {
  runSingleSync ( `${name} -> sync -> write-file-atomic`, writeFileAtomic.sync, buffer );
  runSingleSync ( `${name} -> sync -> write-file-atomic (fastest)`, writeFileAtomic.sync, buffer, { fsync: false } );
  runSingleSync ( `${name} -> sync -> atomically`, writeFileSync, buffer );
  runSingleSync ( `${name} -> sync -> atomically (faster)`, writeFileSync, buffer, { mode: false, chown: false, fsyncWait: false } );
  runSingleSync ( `${name} -> sync -> atomically (fastest)`, writeFileSync, buffer, { mode: false, chown: false, fsync: false } );
};

const runAll = async ( name, buffer ) => {
  await runAllAsync ( name, buffer );
  console.log ( '-------------------' );
  runAllSync ( name, buffer );
};

const run = async () => {
  runAllDummy ();
  console.log ( '===================' );
  await runAll ( '100kb', Buffer.allocUnsafe ( 100 * 1024 ) );
  console.log ( '===================' );
  await runAll ( '10kb', Buffer.allocUnsafe ( 10 * 1024 ) );
  console.log ( '===================' );
  await runAll ( '1kb', Buffer.allocUnsafe ( 1024 ) );
  console.log ( '===================' );
};

run ();
{
  "compilerOptions": {
    "alwaysStrict": true,
    "declaration": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "forceConsistentCasingInFileNames": true,
    "inlineSourceMap": false,
    "jsx": "react",
    "lib": ["dom", "scripthost", "es2015", "es2016", "es2017", "es2018", "es2019", "es2020"],
    "module": "commonjs",
    "moduleResolution": "node",
    "newLine": "LF",
    "noFallthroughCasesInSwitch": true,
    "noUnusedLocals": true,
    "noUnusedParameters": false,
    "outDir": "dist",
    "pretty": true,
    "strictNullChecks": true,
    "target": "es2018"
  },
  "include": [
    "src"
  ],
  "exclude": [
    "node_modules"
  ]
}
"use strict";
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
    if (kind === "m") throw new TypeError("Private method is not writable");
    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
    return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
    return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _a, _b;
var _Conf_validator, _Conf_encryptionKey, _Conf_options, _Conf_defaultValues;
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("util");
const fs = require("fs");
const path = require("path");
const crypto = require("crypto");
const assert = require("assert");
const events_1 = require("events");
const dotProp = require("dot-prop");
const pkgUp = require("pkg-up");
const envPaths = require("env-paths");
const atomically = require("atomically");
const ajv_1 = require("ajv");
const ajv_formats_1 = require("ajv-formats");
const debounceFn = require("debounce-fn");
const semver = require("semver");
const onetime = require("onetime");
const encryptionAlgorithm = 'aes-256-cbc';
const createPlainObject = () => {
    return Object.create(null);
};
const isExist = (data) => {
    return data !== undefined && data !== null;
};
let parentDir = '';
try {
    // Prevent caching of this module so module.parent is always accurate.
    // Note: This trick won't work with ESM or inside a webworker
    // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
    delete require.cache[__filename];
    parentDir = path.dirname((_b = (_a = module.parent) === null || _a === void 0 ? void 0 : _a.filename) !== null && _b !== void 0 ? _b : '.');
}
catch (_c) { }
const checkValueType = (key, value) => {
    const nonJsonTypes = new Set([
        'undefined',
        'symbol',
        'function'
    ]);
    const type = typeof value;
    if (nonJsonTypes.has(type)) {
        throw new TypeError(`Setting a value of type \`${type}\` for key \`${key}\` is not allowed as it's not supported by JSON`);
    }
};
const INTERNAL_KEY = '__internal__';
const MIGRATION_KEY = `${INTERNAL_KEY}.migrations.version`;
class Conf {
    constructor(partialOptions = {}) {
        var _a;
        _Conf_validator.set(this, void 0);
        _Conf_encryptionKey.set(this, void 0);
        _Conf_options.set(this, void 0);
        _Conf_defaultValues.set(this, {});
        this._deserialize = value => JSON.parse(value);
        this._serialize = value => JSON.stringify(value, undefined, '\t');
        const options = {
            configName: 'config',
            fileExtension: 'json',
            projectSuffix: 'nodejs',
            clearInvalidConfig: false,
            accessPropertiesByDotNotation: true,
            configFileMode: 0o666,
            ...partialOptions
        };
        const getPackageData = onetime(() => {
            const packagePath = pkgUp.sync({ cwd: parentDir });
            // Can't use `require` because of Webpack being annoying:
            // https://github.com/webpack/webpack/issues/196
            const packageData = packagePath && JSON.parse(fs.readFileSync(packagePath, 'utf8'));
            return packageData !== null && packageData !== void 0 ? packageData : {};
        });
        if (!options.cwd) {
            if (!options.projectName) {
                options.projectName = getPackageData().name;
            }
            if (!options.projectName) {
                throw new Error('Project name could not be inferred. Please specify the `projectName` option.');
            }
            options.cwd = envPaths(options.projectName, { suffix: options.projectSuffix }).config;
        }
        __classPrivateFieldSet(this, _Conf_options, options, "f");
        if (options.schema) {
            if (typeof options.schema !== 'object') {
                throw new TypeError('The `schema` option must be an object.');
            }
            const ajv = new ajv_1.default({
                allErrors: true,
                useDefaults: true
            });
            (0, ajv_formats_1.default)(ajv);
            const schema = {
                type: 'object',
                properties: options.schema
            };
            __classPrivateFieldSet(this, _Conf_validator, ajv.compile(schema), "f");
            for (const [key, value] of Object.entries(options.schema)) {
                if (value === null || value === void 0 ? void 0 : value.default) {
                    __classPrivateFieldGet(this, _Conf_defaultValues, "f")[key] = value.default;
                }
            }
        }
        if (options.defaults) {
            __classPrivateFieldSet(this, _Conf_defaultValues, {
                ...__classPrivateFieldGet(this, _Conf_defaultValues, "f"),
                ...options.defaults
            }, "f");
        }
        if (options.serialize) {
            this._serialize = options.serialize;
        }
        if (options.deserialize) {
            this._deserialize = options.deserialize;
        }
        this.events = new events_1.EventEmitter();
        __classPrivateFieldSet(this, _Conf_encryptionKey, options.encryptionKey, "f");
        const fileExtension = options.fileExtension ? `.${options.fileExtension}` : '';
        this.path = path.resolve(options.cwd, `${(_a = options.configName) !== null && _a !== void 0 ? _a : 'config'}${fileExtension}`);
        const fileStore = this.store;
        const store = Object.assign(createPlainObject(), options.defaults, fileStore);
        this._validate(store);
        try {
            assert.deepEqual(fileStore, store);
        }
        catch (_b) {
            this.store = store;
        }
        if (options.watch) {
            this._watch();
        }
        if (options.migrations) {
            if (!options.projectVersion) {
                options.projectVersion = getPackageData().version;
            }
            if (!options.projectVersion) {
                throw new Error('Project version could not be inferred. Please specify the `projectVersion` option.');
            }
            this._migrate(options.migrations, options.projectVersion, options.beforeEachMigration);
        }
    }
    get(key, defaultValue) {
        if (__classPrivateFieldGet(this, _Conf_options, "f").accessPropertiesByDotNotation) {
            return this._get(key, defaultValue);
        }
        const { store } = this;
        return key in store ? store[key] : defaultValue;
    }
    set(key, value) {
        if (typeof key !== 'string' && typeof key !== 'object') {
            throw new TypeError(`Expected \`key\` to be of type \`string\` or \`object\`, got ${typeof key}`);
        }
        if (typeof key !== 'object' && value === undefined) {
            throw new TypeError('Use `delete()` to clear values');
        }
        if (this._containsReservedKey(key)) {
            throw new TypeError(`Please don't use the ${INTERNAL_KEY} key, as it's used to manage this module internal operations.`);
        }
        const { store } = this;
        const set = (key, value) => {
            checkValueType(key, value);
            if (__classPrivateFieldGet(this, _Conf_options, "f").accessPropertiesByDotNotation) {
                dotProp.set(store, key, value);
            }
            else {
                store[key] = value;
            }
        };
        if (typeof key === 'object') {
            const object = key;
            for (const [key, value] of Object.entries(object)) {
                set(key, value);
            }
        }
        else {
            set(key, value);
        }
        this.store = store;
    }
    /**
    Check if an item exists.

    @param key - The key of the item to check.
    */
    has(key) {
        if (__classPrivateFieldGet(this, _Conf_options, "f").accessPropertiesByDotNotation) {
            return dotProp.has(this.store, key);
        }
        return key in this.store;
    }
    /**
    Reset items to their default values, as defined by the `defaults` or `schema` option.

    @see `clear()` to reset all items.

    @param keys - The keys of the items to reset.
    */
    reset(...keys) {
        for (const key of keys) {
            if (isExist(__classPrivateFieldGet(this, _Conf_defaultValues, "f")[key])) {
                this.set(key, __classPrivateFieldGet(this, _Conf_defaultValues, "f")[key]);
            }
        }
    }
    /**
    Delete an item.

    @param key - The key of the item to delete.
    */
    delete(key) {
        const { store } = this;
        if (__classPrivateFieldGet(this, _Conf_options, "f").accessPropertiesByDotNotation) {
            dotProp.delete(store, key);
        }
        else {
            // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
            delete store[key];
        }
        this.store = store;
    }
    /**
    Delete all items.

    This resets known items to their default values, if defined by the `defaults` or `schema` option.
    */
    clear() {
        this.store = createPlainObject();
        for (const key of Object.keys(__classPrivateFieldGet(this, _Conf_defaultValues, "f"))) {
            this.reset(key);
        }
    }
    /**
    Watches the given `key`, calling `callback` on any changes.

    @param key - The key wo watch.
    @param callback - A callback function that is called on any changes. When a `key` is first set `oldValue` will be `undefined`, and when a key is deleted `newValue` will be `undefined`.
    @returns A function, that when called, will unsubscribe.
    */
    onDidChange(key, callback) {
        if (typeof key !== 'string') {
            throw new TypeError(`Expected \`key\` to be of type \`string\`, got ${typeof key}`);
        }
        if (typeof callback !== 'function') {
            throw new TypeError(`Expected \`callback\` to be of type \`function\`, got ${typeof callback}`);
        }
        return this._handleChange(() => this.get(key), callback);
    }
    /**
    Watches the whole config object, calling `callback` on any changes.

    @param callback - A callback function that is called on any changes. When a `key` is first set `oldValue` will be `undefined`, and when a key is deleted `newValue` will be `undefined`.
    @returns A function, that when called, will unsubscribe.
    */
    onDidAnyChange(callback) {
        if (typeof callback !== 'function') {
            throw new TypeError(`Expected \`callback\` to be of type \`function\`, got ${typeof callback}`);
        }
        return this._handleChange(() => this.store, callback);
    }
    get size() {
        return Object.keys(this.store).length;
    }
    get store() {
        try {
            const data = fs.readFileSync(this.path, __classPrivateFieldGet(this, _Conf_encryptionKey, "f") ? null : 'utf8');
            const dataString = this._encryptData(data);
            const deserializedData = this._deserialize(dataString);
            this._validate(deserializedData);
            return Object.assign(createPlainObject(), deserializedData);
        }
        catch (error) {
            if ((error === null || error === void 0 ? void 0 : error.code) === 'ENOENT') {
                this._ensureDirectory();
                return createPlainObject();
            }
            if (__classPrivateFieldGet(this, _Conf_options, "f").clearInvalidConfig && error.name === 'SyntaxError') {
                return createPlainObject();
            }
            throw error;
        }
    }
    set store(value) {
        this._ensureDirectory();
        this._validate(value);
        this._write(value);
        this.events.emit('change');
    }
    *[(_Conf_validator = new WeakMap(), _Conf_encryptionKey = new WeakMap(), _Conf_options = new WeakMap(), _Conf_defaultValues = new WeakMap(), Symbol.iterator)]() {
        for (const [key, value] of Object.entries(this.store)) {
            yield [key, value];
        }
    }
    _encryptData(data) {
        if (!__classPrivateFieldGet(this, _Conf_encryptionKey, "f")) {
            return data.toString();
        }
        try {
            // Check if an initialization vector has been used to encrypt the data
            if (__classPrivateFieldGet(this, _Conf_encryptionKey, "f")) {
                try {
                    if (data.slice(16, 17).toString() === ':') {
                        const initializationVector = data.slice(0, 16);
                        const password = crypto.pbkdf2Sync(__classPrivateFieldGet(this, _Conf_encryptionKey, "f"), initializationVector.toString(), 10000, 32, 'sha512');
                        const decipher = crypto.createDecipheriv(encryptionAlgorithm, password, initializationVector);
                        data = Buffer.concat([decipher.update(Buffer.from(data.slice(17))), decipher.final()]).toString('utf8');
                    }
                    else {
                        // TODO: Remove this in the next major version.
                        const decipher = crypto.createDecipher(encryptionAlgorithm, __classPrivateFieldGet(this, _Conf_encryptionKey, "f"));
                        data = Buffer.concat([decipher.update(Buffer.from(data)), decipher.final()]).toString('utf8');
                    }
                }
                catch (_a) { }
            }
        }
        catch (_b) { }
        return data.toString();
    }
    _handleChange(getter, callback) {
        let currentValue = getter();
        const onChange = () => {
            const oldValue = currentValue;
            const newValue = getter();
            if ((0, util_1.isDeepStrictEqual)(newValue, oldValue)) {
                return;
            }
            currentValue = newValue;
            callback.call(this, newValue, oldValue);
        };
        this.events.on('change', onChange);
        return () => this.events.removeListener('change', onChange);
    }
    _validate(data) {
        if (!__classPrivateFieldGet(this, _Conf_validator, "f")) {
            return;
        }
        const valid = __classPrivateFieldGet(this, _Conf_validator, "f").call(this, data);
        if (valid || !__classPrivateFieldGet(this, _Conf_validator, "f").errors) {
            return;
        }
        const errors = __classPrivateFieldGet(this, _Conf_validator, "f").errors
            .map(({ instancePath, message = '' }) => `\`${instancePath.slice(1)}\` ${message}`);
        throw new Error('Config schema violation: ' + errors.join('; '));
    }
    _ensureDirectory() {
        // Ensure the directory exists as it could have been deleted in the meantime.
        fs.mkdirSync(path.dirname(this.path), { recursive: true });
    }
    _write(value) {
        let data = this._serialize(value);
        if (__classPrivateFieldGet(this, _Conf_encryptionKey, "f")) {
            const initializationVector = crypto.randomBytes(16);
            const password = crypto.pbkdf2Sync(__classPrivateFieldGet(this, _Conf_encryptionKey, "f"), initializationVector.toString(), 10000, 32, 'sha512');
            const cipher = crypto.createCipheriv(encryptionAlgorithm, password, initializationVector);
            data = Buffer.concat([initializationVector, Buffer.from(':'), cipher.update(Buffer.from(data)), cipher.final()]);
        }
        // Temporary workaround for Conf being packaged in a Ubuntu Snap app.
        // See https://github.com/sindresorhus/conf/pull/82
        if (process.env.SNAP) {
            fs.writeFileSync(this.path, data, { mode: __classPrivateFieldGet(this, _Conf_options, "f").configFileMode });
        }
        else {
            try {
                atomically.writeFileSync(this.path, data, { mode: __classPrivateFieldGet(this, _Conf_options, "f").configFileMode });
            }
            catch (error) {
                // Fix for https://github.com/sindresorhus/electron-store/issues/106
                // Sometimes on Windows, we will get an EXDEV error when atomic writing
                // (even though to the same directory), so we fall back to non atomic write
                if ((error === null || error === void 0 ? void 0 : error.code) === 'EXDEV') {
                    fs.writeFileSync(this.path, data, { mode: __classPrivateFieldGet(this, _Conf_options, "f").configFileMode });
                    return;
                }
                throw error;
            }
        }
    }
    _watch() {
        this._ensureDirectory();
        if (!fs.existsSync(this.path)) {
            this._write(createPlainObject());
        }
        if (process.platform === 'win32') {
            fs.watch(this.path, { persistent: false }, debounceFn(() => {
                // On Linux and Windows, writing to the config file emits a `rename` event, so we skip checking the event type.
                this.events.emit('change');
            }, { wait: 100 }));
        }
        else {
            fs.watchFile(this.path, { persistent: false }, debounceFn(() => {
                this.events.emit('change');
            }, { wait: 5000 }));
        }
    }
    _migrate(migrations, versionToMigrate, beforeEachMigration) {
        let previousMigratedVersion = this._get(MIGRATION_KEY, '0.0.0');
        const newerVersions = Object.keys(migrations)
            .filter(candidateVersion => this._shouldPerformMigration(candidateVersion, previousMigratedVersion, versionToMigrate));
        let storeBackup = { ...this.store };
        for (const version of newerVersions) {
            try {
                if (beforeEachMigration) {
                    beforeEachMigration(this, {
                        fromVersion: previousMigratedVersion,
                        toVersion: version,
                        finalVersion: versionToMigrate,
                        versions: newerVersions
                    });
                }
                const migration = migrations[version];
                migration(this);
                this._set(MIGRATION_KEY, version);
                previousMigratedVersion = version;
                storeBackup = { ...this.store };
            }
            catch (error) {
                this.store = storeBackup;
                throw new Error(`Something went wrong during the migration! Changes applied to the store until this failed migration will be restored. ${error}`);
            }
        }
        if (this._isVersionInRangeFormat(previousMigratedVersion) || !semver.eq(previousMigratedVersion, versionToMigrate)) {
            this._set(MIGRATION_KEY, versionToMigrate);
        }
    }
    _containsReservedKey(key) {
        if (typeof key === 'object') {
            const firsKey = Object.keys(key)[0];
            if (firsKey === INTERNAL_KEY) {
                return true;
            }
        }
        if (typeof key !== 'string') {
            return false;
        }
        if (__classPrivateFieldGet(this, _Conf_options, "f").accessPropertiesByDotNotation) {
            if (key.startsWith(`${INTERNAL_KEY}.`)) {
                return true;
            }
            return false;
        }
        return false;
    }
    _isVersionInRangeFormat(version) {
        return semver.clean(version) === null;
    }
    _shouldPerformMigration(candidateVersion, previousMigratedVersion, versionToMigrate) {
        if (this._isVersionInRangeFormat(candidateVersion)) {
            if (previousMigratedVersion !== '0.0.0' && semver.satisfies(previousMigratedVersion, candidateVersion)) {
                return false;
            }
            return semver.satisfies(versionToMigrate, candidateVersion);
        }
        if (semver.lte(candidateVersion, previousMigratedVersion)) {
            return false;
        }
        if (semver.gt(candidateVersion, versionToMigrate)) {
            return false;
        }
        return true;
    }
    _get(key, defaultValue) {
        return dotProp.get(this.store, key, defaultValue);
    }
    _set(key, value) {
        const { store } = this;
        dotProp.set(store, key, value);
        this.store = store;
    }
}
exports.default = Conf;
// For CommonJS default export support
module.exports = Conf;
module.exports.default = Conf;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "conf",
  "version": "10.2.0",
  "description": "Simple config handling for your app or module",
  "license": "MIT",
  "repository": "sindresorhus/conf",
  "funding": "https://github.com/sponsors/sindresorhus",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "main": "dist/source",
  "engines": {
    "node": ">=12"
  },
  "files": [
    "dist/source"
  ],
  "dependencies": {
    "ajv": "^8.6.3",
    "ajv-formats": "^2.1.1",
    "atomically": "^1.7.0",
    "debounce-fn": "^4.0.0",
    "dot-prop": "^6.0.1",
    "env-paths": "^2.2.1",
    "json-schema-typed": "^7.0.3",
    "onetime": "^5.1.2",
    "pkg-up": "^3.1.0",
    "semver": "^7.3.5"
  },
  "devDependencies": {
    "@ava/typescript": "^1.1.1",
    "@sindresorhus/tsconfig": "^0.7.0",
    "@types/node": "^14.14.41",
    "@types/semver": "^7.3.4",
    "@types/write-file-atomic": "^3.0.1",
    "ava": "^3.15.0",
    "clear-module": "^4.1.1",
    "del": "^6.0.0",
    "del-cli": "^3.0.1",
    "delay": "^5.0.0",
    "nyc": "^15.1.0",
    "p-event": "^4.2.0",
    "tempy": "^1.0.1",
    "tsd": "^0.14.0",
    "typescript": "^4.4.3",
    "xo": "^0.38.2"
  },
  "types": "dist/source"
}'use strict';
const mimicFn = require('mimic-fn');

module.exports = (inputFunction, options = {}) => {
	if (typeof inputFunction !== 'function') {
		throw new TypeError(`Expected the first argument to be a function, got \`${typeof inputFunction}\``);
	}

	const {
		wait = 0,
		before = false,
		after = true
	} = options;

	if (!before && !after) {
		throw new Error('Both `before` and `after` are false, function wouldn\'t be called.');
	}

	let timeout;
	let result;

	const debouncedFunction = function (...arguments_) {
		const context = this;

		const later = () => {
			timeout = undefined;

			if (after) {
				result = inputFunction.apply(context, arguments_);
			}
		};

		const shouldCallNow = before && !timeout;
		clearTimeout(timeout);
		timeout = setTimeout(later, wait);

		if (shouldCallNow) {
			result = inputFunction.apply(context, arguments_);
		}

		return result;
	};

	mimicFn(debouncedFunction, inputFunction);

	debouncedFunction.cancel = () => {
		if (timeout) {
			clearTimeout(timeout);
			timeout = undefined;
		}
	};

	return debouncedFunction;
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "debounce-fn",
  "version": "4.0.0",
  "description": "Debounce a function",
  "license": "MIT",
  "repository": "sindresorhus/debounce-fn",
  "funding": "https://github.com/sponsors/sindresorhus",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "engines": {
    "node": ">=10"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "dependencies": {
    "mimic-fn": "^3.0.0"
  },
  "devDependencies": {
    "ava": "^1.4.1",
    "delay": "^4.2.0",
    "tsd": "^0.11.0",
    "xo": "^0.26.1"
  }
}'use strict';
const isObj = require('is-obj');

const disallowedKeys = new Set([
	'__proto__',
	'prototype',
	'constructor'
]);

const isValidPath = pathSegments => !pathSegments.some(segment => disallowedKeys.has(segment));

function getPathSegments(path) {
	const pathArray = path.split('.');
	const parts = [];

	for (let i = 0; i < pathArray.length; i++) {
		let p = pathArray[i];

		while (p[p.length - 1] === '\\' && pathArray[i + 1] !== undefined) {
			p = p.slice(0, -1) + '.';
			p += pathArray[++i];
		}

		parts.push(p);
	}

	if (!isValidPath(parts)) {
		return [];
	}

	return parts;
}

module.exports = {
	get(object, path, value) {
		if (!isObj(object) || typeof path !== 'string') {
			return value === undefined ? object : value;
		}

		const pathArray = getPathSegments(path);
		if (pathArray.length === 0) {
			return;
		}

		for (let i = 0; i < pathArray.length; i++) {
			object = object[pathArray[i]];

			if (object === undefined || object === null) {
				// `object` is either `undefined` or `null` so we want to stop the loop, and
				// if this is not the last bit of the path, and
				// if it did't return `undefined`
				// it would return `null` if `object` is `null`
				// but we want `get({foo: null}, 'foo.bar')` to equal `undefined`, or the supplied value, not `null`
				if (i !== pathArray.length - 1) {
					return value;
				}

				break;
			}
		}

		return object === undefined ? value : object;
	},

	set(object, path, value) {
		if (!isObj(object) || typeof path !== 'string') {
			return object;
		}

		const root = object;
		const pathArray = getPathSegments(path);

		for (let i = 0; i < pathArray.length; i++) {
			const p = pathArray[i];

			if (!isObj(object[p])) {
				object[p] = {};
			}

			if (i === pathArray.length - 1) {
				object[p] = value;
			}

			object = object[p];
		}

		return root;
	},

	delete(object, path) {
		if (!isObj(object) || typeof path !== 'string') {
			return false;
		}

		const pathArray = getPathSegments(path);

		for (let i = 0; i < pathArray.length; i++) {
			const p = pathArray[i];

			if (i === pathArray.length - 1) {
				delete object[p];
				return true;
			}

			object = object[p];

			if (!isObj(object)) {
				return false;
			}
		}
	},

	has(object, path) {
		if (!isObj(object) || typeof path !== 'string') {
			return false;
		}

		const pathArray = getPathSegments(path);
		if (pathArray.length === 0) {
			return false;
		}

		// eslint-disable-next-line unicorn/no-for-loop
		for (let i = 0; i < pathArray.length; i++) {
			if (isObj(object)) {
				if (!(pathArray[i] in object)) {
					return false;
				}

				object = object[pathArray[i]];
			} else {
				return false;
			}
		}

		return true;
	}
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "dot-prop",
  "version": "6.0.1",
  "description": "Get, set, or delete a property from a nested object using a dot path",
  "license": "MIT",
  "repository": "sindresorhus/dot-prop",
  "funding": "https://github.com/sponsors/sindresorhus",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "engines": {
    "node": ">=10"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "dependencies": {
    "is-obj": "^2.0.0"
  },
  "devDependencies": {
    "ava": "^2.1.0",
    "benchmark": "^2.1.4",
    "tsd": "^0.13.1",
    "xo": "^0.33.1"
  }
}'use strict';
const path = require('path');
const {app, ipcMain, ipcRenderer, shell} = require('electron');
const Conf = require('conf');

let isInitialized = false;

// Set up the `ipcMain` handler for communication between renderer and main process.
const initDataListener = () => {
	if (!ipcMain || !app) {
		throw new Error('Electron Store: You need to call `.initRenderer()` from the main process.');
	}

	const appData = {
		defaultCwd: app.getPath('userData'),
		appVersion: app.getVersion()
	};

	if (isInitialized) {
		return appData;
	}

	ipcMain.on('electron-store-get-data', event => {
		event.returnValue = appData;
	});

	isInitialized = true;

	return appData;
};

class ElectronStore extends Conf {
	constructor(options) {
		let defaultCwd;
		let appVersion;

		// If we are in the renderer process, we communicate with the main process
		// to get the required data for the module otherwise, we pull from the main process.
		if (ipcRenderer) {
			const appData = ipcRenderer.sendSync('electron-store-get-data');

			if (!appData) {
				throw new Error('Electron Store: You need to call `.initRenderer()` from the main process.');
			}

			({defaultCwd, appVersion} = appData);
		} else if (ipcMain && app) {
			({defaultCwd, appVersion} = initDataListener());
		}

		options = {
			name: 'config',
			...options
		};

		if (!options.projectVersion) {
			options.projectVersion = appVersion;
		}

		if (options.cwd) {
			options.cwd = path.isAbsolute(options.cwd) ? options.cwd : path.join(defaultCwd, options.cwd);
		} else {
			options.cwd = defaultCwd;
		}

		options.configName = options.name;
		delete options.name;

		super(options);
	}

	static initRenderer() {
		initDataListener();
	}

	async openInEditor() {
		const error = await shell.openPath(this.path);

		if (error) {
			throw new Error(error);
		}
	}
}

module.exports = ElectronStore;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "electron-store",
  "version": "8.2.0",
  "description": "Simple data persistence for your Electron app or module - Save and load user settings, app state, cache, etc",
  "license": "MIT",
  "repository": "sindresorhus/electron-store",
  "funding": "https://github.com/sponsors/sindresorhus",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "sideEffects": false,
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "dependencies": {
    "conf": "^10.2.0",
    "type-fest": "^2.17.0"
  },
  "devDependencies": {
    "ava": "^2.4.0",
    "electron": "^12.0.4",
    "execa": "^5.0.0",
    "tsd": "^0.14.0",
    "xo": "^0.38.2"
  }
}'use strict';
const path = require('path');
const os = require('os');

const homedir = os.homedir();
const tmpdir = os.tmpdir();
const {env} = process;

const macos = name => {
	const library = path.join(homedir, 'Library');

	return {
		data: path.join(library, 'Application Support', name),
		config: path.join(library, 'Preferences', name),
		cache: path.join(library, 'Caches', name),
		log: path.join(library, 'Logs', name),
		temp: path.join(tmpdir, name)
	};
};

const windows = name => {
	const appData = env.APPDATA || path.join(homedir, 'AppData', 'Roaming');
	const localAppData = env.LOCALAPPDATA || path.join(homedir, 'AppData', 'Local');

	return {
		// Data/config/cache/log are invented by me as Windows isn't opinionated about this
		data: path.join(localAppData, name, 'Data'),
		config: path.join(appData, name, 'Config'),
		cache: path.join(localAppData, name, 'Cache'),
		log: path.join(localAppData, name, 'Log'),
		temp: path.join(tmpdir, name)
	};
};

// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
const linux = name => {
	const username = path.basename(homedir);

	return {
		data: path.join(env.XDG_DATA_HOME || path.join(homedir, '.local', 'share'), name),
		config: path.join(env.XDG_CONFIG_HOME || path.join(homedir, '.config'), name),
		cache: path.join(env.XDG_CACHE_HOME || path.join(homedir, '.cache'), name),
		// https://wiki.debian.org/XDGBaseDirectorySpecification#state
		log: path.join(env.XDG_STATE_HOME || path.join(homedir, '.local', 'state'), name),
		temp: path.join(tmpdir, username, name)
	};
};

const envPaths = (name, options) => {
	if (typeof name !== 'string') {
		throw new TypeError(`Expected string, got ${typeof name}`);
	}

	options = Object.assign({suffix: 'nodejs'}, options);

	if (options.suffix) {
		// Add suffix to prevent possible conflict with native apps
		name += `-${options.suffix}`;
	}

	if (process.platform === 'darwin') {
		return macos(name);
	}

	if (process.platform === 'win32') {
		return windows(name);
	}

	return linux(name);
};

module.exports = envPaths;
// TODO: Remove this for the next major release
module.exports.default = envPaths;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "env-paths",
  "version": "2.2.1",
  "description": "Get paths for storing things like data, config, cache, etc",
  "license": "MIT",
  "repository": "sindresorhus/env-paths",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.1",
    "xo": "^0.24.0"
  }
}MIT License

Copyright (c) 2017 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

// do not edit .js files directly - edit src/index.jst


  var envHasBigInt64Array = typeof BigInt64Array !== 'undefined';


module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }


    if ((a instanceof Map) && (b instanceof Map)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      for (i of a.entries())
        if (!equal(i[1], b.get(i[0]))) return false;
      return true;
    }

    if ((a instanceof Set) && (b instanceof Set)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      return true;
    }

    if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (a[i] !== b[i]) return false;
      return true;
    }


    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
'use strict';

// do not edit .js files directly - edit src/index.jst


  var envHasBigInt64Array = typeof BigInt64Array !== 'undefined';


module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }


    if ((a instanceof Map) && (b instanceof Map)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      for (i of a.entries())
        if (!equal(i[1], b.get(i[0]))) return false;
      return true;
    }

    if ((a instanceof Set) && (b instanceof Set)) {
      if (a.size !== b.size) return false;
      for (i of a.entries())
        if (!b.has(i[0])) return false;
      return true;
    }

    if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (a[i] !== b[i]) return false;
      return true;
    }


    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (key === '_owner' && a.$$typeof) {
        // React-specific: avoid traversing React elements' _owner.
        //  _owner contains circular references
        // and is not needed when comparing the actual elements (and not their owners)
        continue;
      }

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
'use strict';

// do not edit .js files directly - edit src/index.jst



module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }



    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
{
  "name": "fast-deep-equal",
  "version": "3.1.3",
  "description": "Fast deep equal",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/epoberezkin/fast-deep-equal.git"
  },
  "author": "Evgeny Poberezkin",
  "license": "MIT",
  "homepage": "https://github.com/epoberezkin/fast-deep-equal#readme",
  "devDependencies": {
    "coveralls": "^3.1.0",
    "dot": "^1.1.2",
    "eslint": "^7.2.0",
    "mocha": "^7.2.0",
    "nyc": "^15.1.0",
    "pre-commit": "^1.2.2",
    "react": "^16.12.0",
    "react-test-renderer": "^16.12.0",
    "sinon": "^9.0.2",
    "typescript": "^3.9.5"
  },
  "files": [
    "index.js",
    "index.d.ts",
    "react.js",
    "react.d.ts",
    "es6/"
  ],
  "types": "index.d.ts"
}'use strict';

// do not edit .js files directly - edit src/index.jst



module.exports = function equal(a, b) {
  if (a === b) return true;

  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (a.constructor !== b.constructor) return false;

    var length, i, keys;
    if (Array.isArray(a)) {
      length = a.length;
      if (length != b.length) return false;
      for (i = length; i-- !== 0;)
        if (!equal(a[i], b[i])) return false;
      return true;
    }



    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();

    keys = Object.keys(a);
    length = keys.length;
    if (length !== Object.keys(b).length) return false;

    for (i = length; i-- !== 0;)
      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;

    for (i = length; i-- !== 0;) {
      var key = keys[i];

      if (key === '_owner' && a.$$typeof) {
        // React-specific: avoid traversing React elements' _owner.
        //  _owner contains circular references
        // and is not needed when comparing the actual elements (and not their owners)
        continue;
      }

      if (!equal(a[key], b[key])) return false;
    }

    return true;
  }

  // true if both NaN, false otherwise
  return a!==a && b!==b;
};
Copyright (c) 2011-2021, Gary Court until https://github.com/garycourt/uri-js/commit/a1acf730b4bba3f1097c9f52e7d9d3aba8cdcaae
Copyright (c) 2021-present The Fastify team
All rights reserved.

The Fastify team members are listed at https://github.com/fastify/fastify#team.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * The names of any contributors may not be used to endorse or promote
      products derived from this software without specific prior written
      permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

                                  *   *   *

The complete list of contributors can be found at:
- https://github.com/garycourt/uri-js/graphs/contributorsimport { Bench } from 'tinybench'
import { fastUri } from '../index.js'
import { parse as uriJsParse, serialize as uriJsSerialize, resolve as uriJsResolve, equal as uriJsEqual } from 'uri-js'

const base = 'uri://a/b/c/d;p?q'

const domain = 'https://example.com/foo#bar$fiz'
const ipv4 = '//10.10.10.10'
const ipv6 = '//[2001:db8::7]'
const urn = 'urn:foo:a123,456'
const urnuuid = 'urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6'

const urnuuidComponent = {
  scheme: 'urn',
  nid: 'uuid',
  uuid: 'f81d4fae-7dec-11d0-a765-00a0c91e6bf6'
}

const {
  parse: fastUriParse,
  serialize: fastUriSerialize,
  resolve: fastUriResolve,
  equal: fastUriEqual,
} = fastUri

// Initialization as there is a lot to parse at first
// eg: regexes
fastUriParse(domain)
uriJsParse(domain)

const benchFastUri = new Bench({ name: 'fast-uri benchmark' })
const benchUriJs = new Bench({ name: 'uri-js benchmark' })
const benchWHATWG = new Bench({ name: 'WHATWG URL benchmark' })

benchFastUri.add('fast-uri: parse domain', function () {
  fastUriParse(domain)
})
benchUriJs.add('urijs: parse domain', function () {
  uriJsParse(domain)
})
benchWHATWG.add('WHATWG URL: parse domain', function () {
  // eslint-disable-next-line
  new URL(domain)
})
benchFastUri.add('fast-uri: parse IPv4', function () {
  fastUriParse(ipv4)
})
benchUriJs.add('urijs: parse IPv4', function () {
  uriJsParse(ipv4)
})
benchFastUri.add('fast-uri: parse IPv6', function () {
  fastUriParse(ipv6)
})
benchUriJs.add('urijs: parse IPv6', function () {
  uriJsParse(ipv6)
})
benchFastUri.add('fast-uri: parse URN', function () {
  fastUriParse(urn)
})
benchUriJs.add('urijs: parse URN', function () {
  uriJsParse(urn)
})
benchWHATWG.add('WHATWG URL: parse URN', function () {
  // eslint-disable-next-line
  new URL(urn)
})
benchFastUri.add('fast-uri: parse URN uuid', function () {
  fastUriParse(urnuuid)
})
benchUriJs.add('urijs: parse URN uuid', function () {
  uriJsParse(urnuuid)
})
benchFastUri.add('fast-uri: serialize URN uuid', function () {
  fastUriSerialize(urnuuidComponent)
})
benchUriJs.add('uri-js: serialize URN uuid', function () {
  uriJsSerialize(urnuuidComponent)
})
benchFastUri.add('fast-uri: serialize uri', function () {
  fastUriSerialize({
    scheme: 'uri',
    userinfo: 'foo:bar',
    host: 'example.com',
    port: 1,
    path: 'path',
    query: 'query',
    fragment: 'fragment'
  })
})
benchUriJs.add('urijs: serialize uri', function () {
  uriJsSerialize({
    scheme: 'uri',
    userinfo: 'foo:bar',
    host: 'example.com',
    port: 1,
    path: 'path',
    query: 'query',
    fragment: 'fragment'
  })
})
benchFastUri.add('fast-uri: serialize long uri with dots', function () {
  fastUriSerialize({
    scheme: 'uri',
    userinfo: 'foo:bar',
    host: 'example.com',
    port: 1,
    path: './a/./b/c/../.././d/../e/f/.././/',
    query: 'query',
    fragment: 'fragment'
  })
})
benchUriJs.add('urijs: serialize long uri with dots', function () {
  uriJsSerialize({
    scheme: 'uri',
    userinfo: 'foo:bar',
    host: 'example.com',
    port: 1,
    path: './a/./b/c/../.././d/../e/f/.././/',
    query: 'query',
    fragment: 'fragment'
  })
})
benchFastUri.add('fast-uri: serialize IPv6', function () {
  fastUriSerialize({ host: '2606:2800:220:1:248:1893:25c8:1946' })
})
benchUriJs.add('urijs: serialize IPv6', function () {
  uriJsSerialize({ host: '2606:2800:220:1:248:1893:25c8:1946' })
})
benchFastUri.add('fast-uri: serialize ws', function () {
  fastUriSerialize({ scheme: 'ws', host: 'example.com', resourceName: '/foo?bar', secure: true })
})
benchUriJs.add('urijs: serialize ws', function () {
  uriJsSerialize({ scheme: 'ws', host: 'example.com', resourceName: '/foo?bar', secure: true })
})
benchFastUri.add('fast-uri: resolve', function () {
  fastUriResolve(base, '../../../g')
})
benchUriJs.add('urijs: resolve', function () {
  uriJsResolve(base, '../../../g')
})

benchFastUri.add('fast-uri: equal', function () {
  fastUriEqual('example://a/b/c/%7Bfoo%7D', 'eXAMPLE://a/./b/../b/%63/%7bfoo%7d')
})
benchUriJs.add('urijs: equal', function () {
  uriJsEqual('example://a/b/c/%7Bfoo%7D', 'eXAMPLE://a/./b/../b/%63/%7bfoo%7d')
})

await benchFastUri.run()
console.log(benchFastUri.name)
console.table(benchFastUri.table())

await benchUriJs.run()
console.log(benchUriJs.name)
console.table(benchUriJs.table())

await benchWHATWG.run()
console.log(benchWHATWG.name)
console.table(benchWHATWG.table())
import { Bench } from 'tinybench'
import { fastUri } from '../index.js'

const {
  equal: fastUriEqual,
  parse: fastUriParse,
} = fastUri

const stringA = 'example://a/b/c/%7Bfoo%7D'
const stringB = 'eXAMPLE://a/./b/../b/%63/%7bfoo%7d'

const componentA = fastUriParse(stringA)
const componentB = fastUriParse(stringB)

const benchFastUri = new Bench({ name: 'fast-uri equal' })

benchFastUri.add('equal string with string', function () {
  fastUriEqual(stringA, stringA)
})

benchFastUri.add('equal component with component', function () {
  fastUriEqual(componentA, componentA)
})

benchFastUri.add('equal component with string', function () {
  fastUriEqual(componentA, stringA)
})

benchFastUri.add('equal string with component', function () {
  fastUriEqual(stringA, componentA)
})

benchFastUri.add('not equal string with string', function () {
  fastUriEqual(stringA, stringB)
})

benchFastUri.add('not equal component with component', function () {
  fastUriEqual(componentA, componentB)
})

benchFastUri.add('not equal component with string', function () {
  fastUriEqual(componentA, stringB)
})

benchFastUri.add('not equal string with component', function () {
  fastUriEqual(stringA, componentB)
})

await benchFastUri.run()
console.log(benchFastUri.name)
console.table(benchFastUri.table())
import { Bench } from 'tinybench'
import { nonSimpleDomain } from '../lib/utils.js'

const benchNonSimpleDomain = new Bench({ name: 'nonSimpleDomain' })

const exampleCom = 'example.com'
const exaumlmpleCom = 'exämple.com'
const longDomain = 'abc'.repeat(100) + '.com'

console.assert(nonSimpleDomain(exampleCom) === false, 'example.com should be a simple domain')
console.assert(nonSimpleDomain(exaumlmpleCom) === true, 'exämple.com should not be a simple domain')
console.assert(nonSimpleDomain(longDomain) === false, `${longDomain} should be a simple domain?`)

benchNonSimpleDomain.add('nonSimpleDomain', function () {
  nonSimpleDomain(exampleCom)
  nonSimpleDomain(exaumlmpleCom)
  nonSimpleDomain(longDomain)
})

await benchNonSimpleDomain.run()
console.log(benchNonSimpleDomain.name)
console.table(benchNonSimpleDomain.table())
{
  "name": "benchmark",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "private": true,
  "author": "",
  "license": "ISC",
  "dependencies": {
    "tinybench": "^5.0.0",
    "uri-js": "^4.4.1"
  }
}import { Bench } from 'tinybench'
import { stringArrayToHexStripped } from '../lib/utils.js'

const benchStringArrayToHexStripped = new Bench({ name: 'stringArrayToHexStripped' })

const case1 = ['0', '0', '0', '0']
const case2 = ['0', '0', '0', '1']
const case3 = ['0', '0', '1', '0']
const case4 = ['0', '1', '0', '0']
const case5 = ['1', '0', '0', '0']
const case6 = ['1', '0', '0', '1']

benchStringArrayToHexStripped.add('stringArrayToHexStripped', function () {
  stringArrayToHexStripped(case1)
  stringArrayToHexStripped(case2)
  stringArrayToHexStripped(case3)
  stringArrayToHexStripped(case4)
  stringArrayToHexStripped(case5)
  stringArrayToHexStripped(case6)
})

await benchStringArrayToHexStripped.run()
console.log(benchStringArrayToHexStripped.name)
console.table(benchStringArrayToHexStripped.table())
import { Bench } from 'tinybench'
import { wsIsSecure } from '../lib/schemes.js'

const benchWsIsSecure = new Bench({ name: 'wsIsSecure' })

const wsComponentAttributeSecureTrue = {
  scheme: 'ws',
  secure: true,
}

const wsComponentAttributeSecureFalse = {
  scheme: 'ws',
  secure: false,
}

const wssComponent = {
  scheme: 'wss',
}

const wssComponentMixedCase = {
  scheme: 'Wss',
}

const wssComponentUpperCase = {
  scheme: 'WSS',
}

const httpComponent = {
  scheme: 'http',
}

console.assert(wsIsSecure(wsComponentAttributeSecureTrue) === true, 'wsComponentAttributeSecureTrue should be secure')
console.assert(wsIsSecure(wsComponentAttributeSecureFalse) === false, 'wsComponentAttributeSecureFalse should not be secure')
console.assert(wsIsSecure(wssComponent) === true, 'wssComponent should be secure')
console.assert(wsIsSecure(wssComponentMixedCase) === true, 'wssComponentMixedCase should be secure')
console.assert(wsIsSecure(wssComponentUpperCase) === true, 'wssComponentUpperCase should be secure')
console.assert(wsIsSecure(httpComponent) === false, 'httpComponent should not be secure')

benchWsIsSecure.add(JSON.stringify(wsComponentAttributeSecureFalse), function () {
  wsIsSecure(wsComponentAttributeSecureFalse)
})

benchWsIsSecure.add(JSON.stringify(wsComponentAttributeSecureTrue), function () {
  wsIsSecure(wsComponentAttributeSecureTrue)
})

benchWsIsSecure.add(JSON.stringify(wssComponent), function () {
  wsIsSecure(wssComponent)
})

benchWsIsSecure.add(JSON.stringify(wssComponentMixedCase), function () {
  wsIsSecure(wssComponentMixedCase)
})

benchWsIsSecure.add(JSON.stringify(wssComponentUpperCase), function () {
  wsIsSecure(wssComponentUpperCase)
})

benchWsIsSecure.add(JSON.stringify(httpComponent), function () {
  wsIsSecure(httpComponent)
})

await benchWsIsSecure.run()
console.log(benchWsIsSecure.name)
console.table(benchWsIsSecure.table())
'use strict'

module.exports = require('neostandard')({
  ignores: require('neostandard').resolveIgnoresFromGitignore(),
  ts: true
})
'use strict'

const { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizeComponentEncoding, isIPv4, nonSimpleDomain } = require('./lib/utils')
const { SCHEMES, getSchemeHandler } = require('./lib/schemes')

/**
 * @template {import('./types/index').URIComponent|string} T
 * @param {T} uri
 * @param {import('./types/index').Options} [options]
 * @returns {T}
 */
function normalize (uri, options) {
  if (typeof uri === 'string') {
    uri = /** @type {T} */ (serialize(parse(uri, options), options))
  } else if (typeof uri === 'object') {
    uri = /** @type {T} */ (parse(serialize(uri, options), options))
  }
  return uri
}

/**
 * @param {string} baseURI
 * @param {string} relativeURI
 * @param {import('./types/index').Options} [options]
 * @returns {string}
 */
function resolve (baseURI, relativeURI, options) {
  const schemelessOptions = options ? Object.assign({ scheme: 'null' }, options) : { scheme: 'null' }
  const resolved = resolveComponent(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true)
  schemelessOptions.skipEscape = true
  return serialize(resolved, schemelessOptions)
}

/**
 * @param {import ('./types/index').URIComponent} base
 * @param {import ('./types/index').URIComponent} relative
 * @param {import('./types/index').Options} [options]
 * @param {boolean} [skipNormalization=false]
 * @returns {import ('./types/index').URIComponent}
 */
function resolveComponent (base, relative, options, skipNormalization) {
  /** @type {import('./types/index').URIComponent} */
  const target = {}
  if (!skipNormalization) {
    base = parse(serialize(base, options), options) // normalize base component
    relative = parse(serialize(relative, options), options) // normalize relative component
  }
  options = options || {}

  if (!options.tolerant && relative.scheme) {
    target.scheme = relative.scheme
    // target.authority = relative.authority;
    target.userinfo = relative.userinfo
    target.host = relative.host
    target.port = relative.port
    target.path = removeDotSegments(relative.path || '')
    target.query = relative.query
  } else {
    if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {
      // target.authority = relative.authority;
      target.userinfo = relative.userinfo
      target.host = relative.host
      target.port = relative.port
      target.path = removeDotSegments(relative.path || '')
      target.query = relative.query
    } else {
      if (!relative.path) {
        target.path = base.path
        if (relative.query !== undefined) {
          target.query = relative.query
        } else {
          target.query = base.query
        }
      } else {
        if (relative.path[0] === '/') {
          target.path = removeDotSegments(relative.path)
        } else {
          if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {
            target.path = '/' + relative.path
          } else if (!base.path) {
            target.path = relative.path
          } else {
            target.path = base.path.slice(0, base.path.lastIndexOf('/') + 1) + relative.path
          }
          target.path = removeDotSegments(target.path)
        }
        target.query = relative.query
      }
      // target.authority = base.authority;
      target.userinfo = base.userinfo
      target.host = base.host
      target.port = base.port
    }
    target.scheme = base.scheme
  }

  target.fragment = relative.fragment

  return target
}

/**
 * @param {import ('./types/index').URIComponent|string} uriA
 * @param {import ('./types/index').URIComponent|string} uriB
 * @param {import ('./types/index').Options} options
 * @returns {boolean}
 */
function equal (uriA, uriB, options) {
  if (typeof uriA === 'string') {
    uriA = unescape(uriA)
    uriA = serialize(normalizeComponentEncoding(parse(uriA, options), true), { ...options, skipEscape: true })
  } else if (typeof uriA === 'object') {
    uriA = serialize(normalizeComponentEncoding(uriA, true), { ...options, skipEscape: true })
  }

  if (typeof uriB === 'string') {
    uriB = unescape(uriB)
    uriB = serialize(normalizeComponentEncoding(parse(uriB, options), true), { ...options, skipEscape: true })
  } else if (typeof uriB === 'object') {
    uriB = serialize(normalizeComponentEncoding(uriB, true), { ...options, skipEscape: true })
  }

  return uriA.toLowerCase() === uriB.toLowerCase()
}

/**
 * @param {Readonly<import('./types/index').URIComponent>} cmpts
 * @param {import('./types/index').Options} [opts]
 * @returns {string}
 */
function serialize (cmpts, opts) {
  const component = {
    host: cmpts.host,
    scheme: cmpts.scheme,
    userinfo: cmpts.userinfo,
    port: cmpts.port,
    path: cmpts.path,
    query: cmpts.query,
    nid: cmpts.nid,
    nss: cmpts.nss,
    uuid: cmpts.uuid,
    fragment: cmpts.fragment,
    reference: cmpts.reference,
    resourceName: cmpts.resourceName,
    secure: cmpts.secure,
    error: ''
  }
  const options = Object.assign({}, opts)
  const uriTokens = []

  // find scheme handler
  const schemeHandler = getSchemeHandler(options.scheme || component.scheme)

  // perform scheme specific serialization
  if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options)

  if (component.path !== undefined) {
    if (!options.skipEscape) {
      component.path = escape(component.path)

      if (component.scheme !== undefined) {
        component.path = component.path.split('%3A').join(':')
      }
    } else {
      component.path = unescape(component.path)
    }
  }

  if (options.reference !== 'suffix' && component.scheme) {
    uriTokens.push(component.scheme, ':')
  }

  const authority = recomposeAuthority(component)
  if (authority !== undefined) {
    if (options.reference !== 'suffix') {
      uriTokens.push('//')
    }

    uriTokens.push(authority)

    if (component.path && component.path[0] !== '/') {
      uriTokens.push('/')
    }
  }
  if (component.path !== undefined) {
    let s = component.path

    if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
      s = removeDotSegments(s)
    }

    if (
      authority === undefined &&
      s[0] === '/' &&
      s[1] === '/'
    ) {
      // don't allow the path to start with "//"
      s = '/%2F' + s.slice(2)
    }

    uriTokens.push(s)
  }

  if (component.query !== undefined) {
    uriTokens.push('?', component.query)
  }

  if (component.fragment !== undefined) {
    uriTokens.push('#', component.fragment)
  }
  return uriTokens.join('')
}

const URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u

/**
 * @param {string} uri
 * @param {import('./types/index').Options} [opts]
 * @returns
 */
function parse (uri, opts) {
  const options = Object.assign({}, opts)
  /** @type {import('./types/index').URIComponent} */
  const parsed = {
    scheme: undefined,
    userinfo: undefined,
    host: '',
    port: undefined,
    path: '',
    query: undefined,
    fragment: undefined
  }

  let isIP = false
  if (options.reference === 'suffix') {
    if (options.scheme) {
      uri = options.scheme + ':' + uri
    } else {
      uri = '//' + uri
    }
  }

  const matches = uri.match(URI_PARSE)

  if (matches) {
    // store each component
    parsed.scheme = matches[1]
    parsed.userinfo = matches[3]
    parsed.host = matches[4]
    parsed.port = parseInt(matches[5], 10)
    parsed.path = matches[6] || ''
    parsed.query = matches[7]
    parsed.fragment = matches[8]

    // fix port number
    if (isNaN(parsed.port)) {
      parsed.port = matches[5]
    }
    if (parsed.host) {
      const ipv4result = isIPv4(parsed.host)
      if (ipv4result === false) {
        const ipv6result = normalizeIPv6(parsed.host)
        parsed.host = ipv6result.host.toLowerCase()
        isIP = ipv6result.isIPV6
      } else {
        isIP = true
      }
    }
    if (parsed.scheme === undefined && parsed.userinfo === undefined && parsed.host === undefined && parsed.port === undefined && parsed.query === undefined && !parsed.path) {
      parsed.reference = 'same-document'
    } else if (parsed.scheme === undefined) {
      parsed.reference = 'relative'
    } else if (parsed.fragment === undefined) {
      parsed.reference = 'absolute'
    } else {
      parsed.reference = 'uri'
    }

    // check for reference errors
    if (options.reference && options.reference !== 'suffix' && options.reference !== parsed.reference) {
      parsed.error = parsed.error || 'URI is not a ' + options.reference + ' reference.'
    }

    // find scheme handler
    const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme)

    // check if scheme can't handle IRIs
    if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
      // if host component is a domain name
      if (parsed.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost)) && isIP === false && nonSimpleDomain(parsed.host)) {
        // convert Unicode IDN -> ASCII IDN
        try {
          parsed.host = URL.domainToASCII(parsed.host.toLowerCase())
        } catch (e) {
          parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e
        }
      }
      // convert IRI -> URI
    }

    if (!schemeHandler || (schemeHandler && !schemeHandler.skipNormalize)) {
      if (uri.indexOf('%') !== -1) {
        if (parsed.scheme !== undefined) {
          parsed.scheme = unescape(parsed.scheme)
        }
        if (parsed.host !== undefined) {
          parsed.host = unescape(parsed.host)
        }
      }
      if (parsed.path) {
        parsed.path = escape(unescape(parsed.path))
      }
      if (parsed.fragment) {
        parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment))
      }
    }

    // perform scheme specific parsing
    if (schemeHandler && schemeHandler.parse) {
      schemeHandler.parse(parsed, options)
    }
  } else {
    parsed.error = parsed.error || 'URI can not be parsed.'
  }
  return parsed
}

const fastUri = {
  SCHEMES,
  normalize,
  resolve,
  resolveComponent,
  equal,
  serialize,
  parse
}

module.exports = fastUri
module.exports.default = fastUri
module.exports.fastUri = fastUri
'use strict'

const { isUUID } = require('./utils')
const URN_REG = /([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-.:;=@]|%[\da-f]{2})+)/iu

const supportedSchemeNames = /** @type {const} */ (['http', 'https', 'ws',
  'wss', 'urn', 'urn:uuid'])

/** @typedef {supportedSchemeNames[number]} SchemeName */

/**
 * @param {string} name
 * @returns {name is SchemeName}
 */
function isValidSchemeName (name) {
  return supportedSchemeNames.indexOf(/** @type {*} */ (name)) !== -1
}

/**
 * @callback SchemeFn
 * @param {import('../types/index').URIComponent} component
 * @param {import('../types/index').Options} options
 * @returns {import('../types/index').URIComponent}
 */

/**
 * @typedef {Object} SchemeHandler
 * @property {SchemeName} scheme - The scheme name.
 * @property {boolean} [domainHost] - Indicates if the scheme supports domain hosts.
 * @property {SchemeFn} parse - Function to parse the URI component for this scheme.
 * @property {SchemeFn} serialize - Function to serialize the URI component for this scheme.
 * @property {boolean} [skipNormalize] - Indicates if normalization should be skipped for this scheme.
 * @property {boolean} [absolutePath] - Indicates if the scheme uses absolute paths.
 * @property {boolean} [unicodeSupport] - Indicates if the scheme supports Unicode.
 */

/**
 * @param {import('../types/index').URIComponent} wsComponent
 * @returns {boolean}
 */
function wsIsSecure (wsComponent) {
  if (wsComponent.secure === true) {
    return true
  } else if (wsComponent.secure === false) {
    return false
  } else if (wsComponent.scheme) {
    return (
      wsComponent.scheme.length === 3 &&
      (wsComponent.scheme[0] === 'w' || wsComponent.scheme[0] === 'W') &&
      (wsComponent.scheme[1] === 's' || wsComponent.scheme[1] === 'S') &&
      (wsComponent.scheme[2] === 's' || wsComponent.scheme[2] === 'S')
    )
  } else {
    return false
  }
}

/** @type {SchemeFn} */
function httpParse (component) {
  if (!component.host) {
    component.error = component.error || 'HTTP URIs must have a host.'
  }

  return component
}

/** @type {SchemeFn} */
function httpSerialize (component) {
  const secure = String(component.scheme).toLowerCase() === 'https'

  // normalize the default port
  if (component.port === (secure ? 443 : 80) || component.port === '') {
    component.port = undefined
  }

  // normalize the empty path
  if (!component.path) {
    component.path = '/'
  }

  // NOTE: We do not parse query strings for HTTP URIs
  // as WWW Form Url Encoded query strings are part of the HTML4+ spec,
  // and not the HTTP spec.

  return component
}

/** @type {SchemeFn} */
function wsParse (wsComponent) {
// indicate if the secure flag is set
  wsComponent.secure = wsIsSecure(wsComponent)

  // construct resouce name
  wsComponent.resourceName = (wsComponent.path || '/') + (wsComponent.query ? '?' + wsComponent.query : '')
  wsComponent.path = undefined
  wsComponent.query = undefined

  return wsComponent
}

/** @type {SchemeFn} */
function wsSerialize (wsComponent) {
// normalize the default port
  if (wsComponent.port === (wsIsSecure(wsComponent) ? 443 : 80) || wsComponent.port === '') {
    wsComponent.port = undefined
  }

  // ensure scheme matches secure flag
  if (typeof wsComponent.secure === 'boolean') {
    wsComponent.scheme = (wsComponent.secure ? 'wss' : 'ws')
    wsComponent.secure = undefined
  }

  // reconstruct path from resource name
  if (wsComponent.resourceName) {
    const [path, query] = wsComponent.resourceName.split('?')
    wsComponent.path = (path && path !== '/' ? path : undefined)
    wsComponent.query = query
    wsComponent.resourceName = undefined
  }

  // forbid fragment component
  wsComponent.fragment = undefined

  return wsComponent
}

/** @type {SchemeFn} */
function urnParse (urnComponent, options) {
  if (!urnComponent.path) {
    urnComponent.error = 'URN can not be parsed'
    return urnComponent
  }
  const matches = urnComponent.path.match(URN_REG)
  if (matches) {
    const scheme = options.scheme || urnComponent.scheme || 'urn'
    urnComponent.nid = matches[1].toLowerCase()
    urnComponent.nss = matches[2]
    const urnScheme = `${scheme}:${options.nid || urnComponent.nid}`
    const schemeHandler = getSchemeHandler(urnScheme)
    urnComponent.path = undefined

    if (schemeHandler) {
      urnComponent = schemeHandler.parse(urnComponent, options)
    }
  } else {
    urnComponent.error = urnComponent.error || 'URN can not be parsed.'
  }

  return urnComponent
}

/** @type {SchemeFn} */
function urnSerialize (urnComponent, options) {
  if (urnComponent.nid === undefined) {
    throw new Error('URN without nid cannot be serialized')
  }
  const scheme = options.scheme || urnComponent.scheme || 'urn'
  const nid = urnComponent.nid.toLowerCase()
  const urnScheme = `${scheme}:${options.nid || nid}`
  const schemeHandler = getSchemeHandler(urnScheme)

  if (schemeHandler) {
    urnComponent = schemeHandler.serialize(urnComponent, options)
  }

  const uriComponent = urnComponent
  const nss = urnComponent.nss
  uriComponent.path = `${nid || options.nid}:${nss}`

  options.skipEscape = true
  return uriComponent
}

/** @type {SchemeFn} */
function urnuuidParse (urnComponent, options) {
  const uuidComponent = urnComponent
  uuidComponent.uuid = uuidComponent.nss
  uuidComponent.nss = undefined

  if (!options.tolerant && (!uuidComponent.uuid || !isUUID(uuidComponent.uuid))) {
    uuidComponent.error = uuidComponent.error || 'UUID is not valid.'
  }

  return uuidComponent
}

/** @type {SchemeFn} */
function urnuuidSerialize (uuidComponent) {
  const urnComponent = uuidComponent
  // normalize UUID
  urnComponent.nss = (uuidComponent.uuid || '').toLowerCase()
  return urnComponent
}

const http = /** @type {SchemeHandler} */ ({
  scheme: 'http',
  domainHost: true,
  parse: httpParse,
  serialize: httpSerialize
})

const https = /** @type {SchemeHandler} */ ({
  scheme: 'https',
  domainHost: http.domainHost,
  parse: httpParse,
  serialize: httpSerialize
})

const ws = /** @type {SchemeHandler} */ ({
  scheme: 'ws',
  domainHost: true,
  parse: wsParse,
  serialize: wsSerialize
})

const wss = /** @type {SchemeHandler} */ ({
  scheme: 'wss',
  domainHost: ws.domainHost,
  parse: ws.parse,
  serialize: ws.serialize
})

const urn = /** @type {SchemeHandler} */ ({
  scheme: 'urn',
  parse: urnParse,
  serialize: urnSerialize,
  skipNormalize: true
})

const urnuuid = /** @type {SchemeHandler} */ ({
  scheme: 'urn:uuid',
  parse: urnuuidParse,
  serialize: urnuuidSerialize,
  skipNormalize: true
})

const SCHEMES = /** @type {Record<SchemeName, SchemeHandler>} */ ({
  http,
  https,
  ws,
  wss,
  urn,
  'urn:uuid': urnuuid
})

Object.setPrototypeOf(SCHEMES, null)

/**
 * @param {string|undefined} scheme
 * @returns {SchemeHandler|undefined}
 */
function getSchemeHandler (scheme) {
  return (
    scheme && (
      SCHEMES[/** @type {SchemeName} */ (scheme)] ||
      SCHEMES[/** @type {SchemeName} */(scheme.toLowerCase())])
  ) ||
    undefined
}

module.exports = {
  wsIsSecure,
  SCHEMES,
  isValidSchemeName,
  getSchemeHandler,
}
'use strict'

/** @type {(value: string) => boolean} */
const isUUID = RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu)

/** @type {(value: string) => boolean} */
const isIPv4 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u)

/**
 * @param {Array<string>} input
 * @returns {string}
 */
function stringArrayToHexStripped (input) {
  let acc = ''
  let code = 0
  let i = 0

  for (i = 0; i < input.length; i++) {
    code = input[i].charCodeAt(0)
    if (code === 48) {
      continue
    }
    if (!((code >= 48 && code <= 57) || (code >= 65 && code <= 70) || (code >= 97 && code <= 102))) {
      return ''
    }
    acc += input[i]
    break
  }

  for (i += 1; i < input.length; i++) {
    code = input[i].charCodeAt(0)
    if (!((code >= 48 && code <= 57) || (code >= 65 && code <= 70) || (code >= 97 && code <= 102))) {
      return ''
    }
    acc += input[i]
  }
  return acc
}

/**
 * @typedef {Object} GetIPV6Result
 * @property {boolean} error - Indicates if there was an error parsing the IPv6 address.
 * @property {string} address - The parsed IPv6 address.
 * @property {string} [zone] - The zone identifier, if present.
 */

/**
 * @param {string} value
 * @returns {boolean}
 */
const nonSimpleDomain = RegExp.prototype.test.bind(/[^!"$&'()*+,\-.;=_`a-z{}~]/u)

/**
 * @param {Array<string>} buffer
 * @returns {boolean}
 */
function consumeIsZone (buffer) {
  buffer.length = 0
  return true
}

/**
 * @param {Array<string>} buffer
 * @param {Array<string>} address
 * @param {GetIPV6Result} output
 * @returns {boolean}
 */
function consumeHextets (buffer, address, output) {
  if (buffer.length) {
    const hex = stringArrayToHexStripped(buffer)
    if (hex !== '') {
      address.push(hex)
    } else {
      output.error = true
      return false
    }
    buffer.length = 0
  }
  return true
}

/**
 * @param {string} input
 * @returns {GetIPV6Result}
 */
function getIPV6 (input) {
  let tokenCount = 0
  const output = { error: false, address: '', zone: '' }
  /** @type {Array<string>} */
  const address = []
  /** @type {Array<string>} */
  const buffer = []
  let endipv6Encountered = false
  let endIpv6 = false

  let consume = consumeHextets

  for (let i = 0; i < input.length; i++) {
    const cursor = input[i]
    if (cursor === '[' || cursor === ']') { continue }
    if (cursor === ':') {
      if (endipv6Encountered === true) {
        endIpv6 = true
      }
      if (!consume(buffer, address, output)) { break }
      if (++tokenCount > 7) {
        // not valid
        output.error = true
        break
      }
      if (i > 0 && input[i - 1] === ':') {
        endipv6Encountered = true
      }
      address.push(':')
      continue
    } else if (cursor === '%') {
      if (!consume(buffer, address, output)) { break }
      // switch to zone detection
      consume = consumeIsZone
    } else {
      buffer.push(cursor)
      continue
    }
  }
  if (buffer.length) {
    if (consume === consumeIsZone) {
      output.zone = buffer.join('')
    } else if (endIpv6) {
      address.push(buffer.join(''))
    } else {
      address.push(stringArrayToHexStripped(buffer))
    }
  }
  output.address = address.join('')
  return output
}

/**
 * @typedef {Object} NormalizeIPv6Result
 * @property {string} host - The normalized host.
 * @property {string} [escapedHost] - The escaped host.
 * @property {boolean} isIPV6 - Indicates if the host is an IPv6 address.
 */

/**
 * @param {string} host
 * @returns {NormalizeIPv6Result}
 */
function normalizeIPv6 (host) {
  if (findToken(host, ':') < 2) { return { host, isIPV6: false } }
  const ipv6 = getIPV6(host)

  if (!ipv6.error) {
    let newHost = ipv6.address
    let escapedHost = ipv6.address
    if (ipv6.zone) {
      newHost += '%' + ipv6.zone
      escapedHost += '%25' + ipv6.zone
    }
    return { host: newHost, isIPV6: true, escapedHost }
  } else {
    return { host, isIPV6: false }
  }
}

/**
 * @param {string} str
 * @param {string} token
 * @returns {number}
 */
function findToken (str, token) {
  let ind = 0
  for (let i = 0; i < str.length; i++) {
    if (str[i] === token) ind++
  }
  return ind
}

/**
 * @param {string} path
 * @returns {string}
 *
 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4
 */
function removeDotSegments (path) {
  let input = path
  const output = []
  let nextSlash = -1
  let len = 0

  // eslint-disable-next-line no-cond-assign
  while (len = input.length) {
    if (len === 1) {
      if (input === '.') {
        break
      } else if (input === '/') {
        output.push('/')
        break
      } else {
        output.push(input)
        break
      }
    } else if (len === 2) {
      if (input[0] === '.') {
        if (input[1] === '.') {
          break
        } else if (input[1] === '/') {
          input = input.slice(2)
          continue
        }
      } else if (input[0] === '/') {
        if (input[1] === '.' || input[1] === '/') {
          output.push('/')
          break
        }
      }
    } else if (len === 3) {
      if (input === '/..') {
        if (output.length !== 0) {
          output.pop()
        }
        output.push('/')
        break
      }
    }
    if (input[0] === '.') {
      if (input[1] === '.') {
        if (input[2] === '/') {
          input = input.slice(3)
          continue
        }
      } else if (input[1] === '/') {
        input = input.slice(2)
        continue
      }
    } else if (input[0] === '/') {
      if (input[1] === '.') {
        if (input[2] === '/') {
          input = input.slice(2)
          continue
        } else if (input[2] === '.') {
          if (input[3] === '/') {
            input = input.slice(3)
            if (output.length !== 0) {
              output.pop()
            }
            continue
          }
        }
      }
    }

    // Rule 2E: Move normal path segment to output
    if ((nextSlash = input.indexOf('/', 1)) === -1) {
      output.push(input)
      break
    } else {
      output.push(input.slice(0, nextSlash))
      input = input.slice(nextSlash)
    }
  }

  return output.join('')
}

/**
 * @param {import('../types/index').URIComponent} component
 * @param {boolean} esc
 * @returns {import('../types/index').URIComponent}
 */
function normalizeComponentEncoding (component, esc) {
  const func = esc !== true ? escape : unescape
  if (component.scheme !== undefined) {
    component.scheme = func(component.scheme)
  }
  if (component.userinfo !== undefined) {
    component.userinfo = func(component.userinfo)
  }
  if (component.host !== undefined) {
    component.host = func(component.host)
  }
  if (component.path !== undefined) {
    component.path = func(component.path)
  }
  if (component.query !== undefined) {
    component.query = func(component.query)
  }
  if (component.fragment !== undefined) {
    component.fragment = func(component.fragment)
  }
  return component
}

/**
 * @param {import('../types/index').URIComponent} component
 * @returns {string|undefined}
 */
function recomposeAuthority (component) {
  const uriTokens = []

  if (component.userinfo !== undefined) {
    uriTokens.push(component.userinfo)
    uriTokens.push('@')
  }

  if (component.host !== undefined) {
    let host = unescape(component.host)
    if (!isIPv4(host)) {
      const ipV6res = normalizeIPv6(host)
      if (ipV6res.isIPV6 === true) {
        host = `[${ipV6res.escapedHost}]`
      } else {
        host = component.host
      }
    }
    uriTokens.push(host)
  }

  if (typeof component.port === 'number' || typeof component.port === 'string') {
    uriTokens.push(':')
    uriTokens.push(String(component.port))
  }

  return uriTokens.length ? uriTokens.join('') : undefined
};

module.exports = {
  nonSimpleDomain,
  recomposeAuthority,
  normalizeComponentEncoding,
  removeDotSegments,
  isIPv4,
  isUUID,
  normalizeIPv6,
  stringArrayToHexStripped
}
{
  "name": "fast-uri",
  "description": "Dependency-free RFC 3986 URI toolbox",
  "version": "3.1.0",
  "main": "index.js",
  "type": "commonjs",
  "types": "types/index.d.ts",
  "license": "BSD-3-Clause",
  "author": "Vincent Le Goff <vince.legoff@gmail.com> (https://github.com/zekth)",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/fastify/fast-uri.git"
  },
  "homepage": "https://github.com/fastify/fast-uri",
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/fastify"
    },
    {
      "type": "opencollective",
      "url": "https://opencollective.com/fastify"
    }
  ],
  "devDependencies": {
    "@fastify/pre-commit": "^2.1.0",
    "ajv": "^8.16.0",
    "eslint": "^9.17.0",
    "neostandard": "^0.12.0",
    "playwright-test": "^14.1.12",
    "tape": "^5.8.1",
    "tsd": "^0.32.0"
  }
}{
    "compilerOptions": {
        "allowJs": true,
        "checkJs": true,
        "strict": true,
        "noImplicitAny": true,
        "target": "es2015"
    }
}'use strict';
const path = require('path');
const locatePath = require('locate-path');

module.exports = (filename, opts = {}) => {
	const startDir = path.resolve(opts.cwd || '');
	const {root} = path.parse(startDir);

	const filenames = [].concat(filename);

	return new Promise(resolve => {
		(function find(dir) {
			locatePath(filenames, {cwd: dir}).then(file => {
				if (file) {
					resolve(path.join(dir, file));
				} else if (dir === root) {
					resolve(null);
				} else {
					find(path.dirname(dir));
				}
			});
		})(startDir);
	});
};

module.exports.sync = (filename, opts = {}) => {
	let dir = path.resolve(opts.cwd || '');
	const {root} = path.parse(dir);

	const filenames = [].concat(filename);

	// eslint-disable-next-line no-constant-condition
	while (true) {
		const file = locatePath.sync(filenames, {cwd: dir});

		if (file) {
			return path.join(dir, file);
		}

		if (dir === root) {
			return null;
		}

		dir = path.dirname(dir);
	}
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "find-up",
  "version": "3.0.0",
  "description": "Find a file or directory by walking up parent directories",
  "license": "MIT",
  "repository": "sindresorhus/find-up",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "dependencies": {
    "locate-path": "^3.0.0"
  },
  "devDependencies": {
    "ava": "*",
    "tempy": "^0.2.1",
    "xo": "*"
  }
}'use strict';

module.exports = value => {
	const type = typeof value;
	return value !== null && (type === 'object' || type === 'function');
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "is-obj",
  "version": "2.0.0",
  "description": "Check if a value is an object",
  "license": "MIT",
  "repository": "sindresorhus/is-obj",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.2",
    "xo": "^0.24.0"
  }
}extends: eslint:recommended
env:
  node: true
  browser: true
rules:
  block-scoped-var: 2
  complexity: [2, 15]
  curly: [2, multi-or-nest, consistent]
  dot-location: [2, property]
  dot-notation: 2
  indent: [2, 2, SwitchCase: 1]
  linebreak-style: [2, unix]
  new-cap: 2
  no-console: [2, allow: [warn, error]]
  no-else-return: 2
  no-eq-null: 2
  no-fallthrough: 2
  no-invalid-this: 2
  no-return-assign: 2
  no-shadow: 1
  no-trailing-spaces: 2
  no-use-before-define: [2, nofunc]
  quotes: [2, single, avoid-escape]
  semi: [2, always]
  strict: [2, global]
  valid-jsdoc: [2, requireReturn: false]
  no-control-regex: 0
MIT License

Copyright (c) 2017 Evgeny Poberezkin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
'use strict';

var traverse = module.exports = function (schema, opts, cb) {
  // Legacy support for v0.3.1 and earlier.
  if (typeof opts == 'function') {
    cb = opts;
    opts = {};
  }

  cb = opts.cb || cb;
  var pre = (typeof cb == 'function') ? cb : cb.pre || function() {};
  var post = cb.post || function() {};

  _traverse(opts, pre, post, schema, '', schema);
};


traverse.keywords = {
  additionalItems: true,
  items: true,
  contains: true,
  additionalProperties: true,
  propertyNames: true,
  not: true,
  if: true,
  then: true,
  else: true
};

traverse.arrayKeywords = {
  items: true,
  allOf: true,
  anyOf: true,
  oneOf: true
};

traverse.propsKeywords = {
  $defs: true,
  definitions: true,
  properties: true,
  patternProperties: true,
  dependencies: true
};

traverse.skipKeywords = {
  default: true,
  enum: true,
  const: true,
  required: true,
  maximum: true,
  minimum: true,
  exclusiveMaximum: true,
  exclusiveMinimum: true,
  multipleOf: true,
  maxLength: true,
  minLength: true,
  pattern: true,
  format: true,
  maxItems: true,
  minItems: true,
  uniqueItems: true,
  maxProperties: true,
  minProperties: true
};


function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {
  if (schema && typeof schema == 'object' && !Array.isArray(schema)) {
    pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
    for (var key in schema) {
      var sch = schema[key];
      if (Array.isArray(sch)) {
        if (key in traverse.arrayKeywords) {
          for (var i=0; i<sch.length; i++)
            _traverse(opts, pre, post, sch[i], jsonPtr + '/' + key + '/' + i, rootSchema, jsonPtr, key, schema, i);
        }
      } else if (key in traverse.propsKeywords) {
        if (sch && typeof sch == 'object') {
          for (var prop in sch)
            _traverse(opts, pre, post, sch[prop], jsonPtr + '/' + key + '/' + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop);
        }
      } else if (key in traverse.keywords || (opts.allKeys && !(key in traverse.skipKeywords))) {
        _traverse(opts, pre, post, sch, jsonPtr + '/' + key, rootSchema, jsonPtr, key, schema);
      }
    }
    post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);
  }
}


function escapeJsonPtr(str) {
  return str.replace(/~/g, '~0').replace(/\//g, '~1');
}
{
  "name": "json-schema-traverse",
  "version": "1.0.0",
  "description": "Traverse JSON Schema passing each schema object to callback",
  "main": "index.js",
  "types": "index.d.ts",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/epoberezkin/json-schema-traverse.git"
  },
  "author": "Evgeny Poberezkin",
  "license": "MIT",
  "homepage": "https://github.com/epoberezkin/json-schema-traverse#readme",
  "devDependencies": {
    "eslint": "^7.3.1",
    "mocha": "^8.0.1",
    "nyc": "^15.0.0",
    "pre-commit": "^1.2.2"
  }
}parserOptions:
  ecmaVersion: 6
globals:
  beforeEach: false
  describe: false
  it: false
'use strict';

var schema = {
  additionalItems: subschema('additionalItems'),
  items: subschema('items'),
  contains: subschema('contains'),
  additionalProperties: subschema('additionalProperties'),
  propertyNames: subschema('propertyNames'),
  not: subschema('not'),
  allOf: [
    subschema('allOf_0'),
    subschema('allOf_1'),
    {
      items: [
        subschema('items_0'),
        subschema('items_1'),
      ]
    }
  ],
  anyOf: [
    subschema('anyOf_0'),
    subschema('anyOf_1'),
  ],
  oneOf: [
    subschema('oneOf_0'),
    subschema('oneOf_1'),
  ],
  definitions: {
    foo: subschema('definitions_foo'),
    bar: subschema('definitions_bar'),
  },
  properties: {
    foo: subschema('properties_foo'),
    bar: subschema('properties_bar'),
  },
  patternProperties: {
    foo: subschema('patternProperties_foo'),
    bar: subschema('patternProperties_bar'),
  },
  dependencies: {
    foo: subschema('dependencies_foo'),
    bar: subschema('dependencies_bar'),
  },
  required: ['foo', 'bar']
};


function subschema(keyword) {
  var sch = {
    properties: {},
    additionalProperties: false,
    additionalItems: false,
    anyOf: [
      {format: 'email'},
      {format: 'hostname'}
    ]
  };
  sch.properties['foo_' + keyword] = {title: 'foo'};
  sch.properties['bar_' + keyword] = {title: 'bar'};
  return sch;
}


module.exports = {
  schema: schema,

  // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
  expectedCalls: [[schema, '', schema, undefined, undefined, undefined, undefined]]
    .concat(expectedCalls('additionalItems'))
    .concat(expectedCalls('items'))
    .concat(expectedCalls('contains'))
    .concat(expectedCalls('additionalProperties'))
    .concat(expectedCalls('propertyNames'))
    .concat(expectedCalls('not'))
    .concat(expectedCallsChild('allOf', 0))
    .concat(expectedCallsChild('allOf', 1))
    .concat([
      [schema.allOf[2], '/allOf/2', schema, '', 'allOf', schema, 2],
      [schema.allOf[2].items[0], '/allOf/2/items/0', schema, '/allOf/2', 'items', schema.allOf[2], 0],
      [schema.allOf[2].items[0].properties.foo_items_0, '/allOf/2/items/0/properties/foo_items_0', schema, '/allOf/2/items/0', 'properties', schema.allOf[2].items[0], 'foo_items_0'],
      [schema.allOf[2].items[0].properties.bar_items_0, '/allOf/2/items/0/properties/bar_items_0', schema, '/allOf/2/items/0', 'properties', schema.allOf[2].items[0], 'bar_items_0'],
      [schema.allOf[2].items[0].anyOf[0], '/allOf/2/items/0/anyOf/0', schema, '/allOf/2/items/0', 'anyOf', schema.allOf[2].items[0], 0],
      [schema.allOf[2].items[0].anyOf[1], '/allOf/2/items/0/anyOf/1', schema, '/allOf/2/items/0', 'anyOf', schema.allOf[2].items[0], 1],

      [schema.allOf[2].items[1], '/allOf/2/items/1', schema, '/allOf/2', 'items', schema.allOf[2], 1],
      [schema.allOf[2].items[1].properties.foo_items_1, '/allOf/2/items/1/properties/foo_items_1', schema, '/allOf/2/items/1', 'properties', schema.allOf[2].items[1], 'foo_items_1'],
      [schema.allOf[2].items[1].properties.bar_items_1, '/allOf/2/items/1/properties/bar_items_1', schema, '/allOf/2/items/1', 'properties', schema.allOf[2].items[1], 'bar_items_1'],
      [schema.allOf[2].items[1].anyOf[0], '/allOf/2/items/1/anyOf/0', schema, '/allOf/2/items/1', 'anyOf', schema.allOf[2].items[1], 0],
      [schema.allOf[2].items[1].anyOf[1], '/allOf/2/items/1/anyOf/1', schema, '/allOf/2/items/1', 'anyOf', schema.allOf[2].items[1], 1]
    ])
    .concat(expectedCallsChild('anyOf', 0))
    .concat(expectedCallsChild('anyOf', 1))
    .concat(expectedCallsChild('oneOf', 0))
    .concat(expectedCallsChild('oneOf', 1))
    .concat(expectedCallsChild('definitions', 'foo'))
    .concat(expectedCallsChild('definitions', 'bar'))
    .concat(expectedCallsChild('properties', 'foo'))
    .concat(expectedCallsChild('properties', 'bar'))
    .concat(expectedCallsChild('patternProperties', 'foo'))
    .concat(expectedCallsChild('patternProperties', 'bar'))
    .concat(expectedCallsChild('dependencies', 'foo'))
    .concat(expectedCallsChild('dependencies', 'bar'))
};


function expectedCalls(keyword) {
  return [
    [schema[keyword], `/${keyword}`, schema, '', keyword, schema, undefined],
    [schema[keyword].properties[`foo_${keyword}`], `/${keyword}/properties/foo_${keyword}`, schema, `/${keyword}`, 'properties', schema[keyword], `foo_${keyword}`],
    [schema[keyword].properties[`bar_${keyword}`], `/${keyword}/properties/bar_${keyword}`, schema, `/${keyword}`, 'properties', schema[keyword], `bar_${keyword}`],
    [schema[keyword].anyOf[0], `/${keyword}/anyOf/0`, schema, `/${keyword}`, 'anyOf', schema[keyword], 0],
    [schema[keyword].anyOf[1], `/${keyword}/anyOf/1`, schema, `/${keyword}`, 'anyOf', schema[keyword], 1]
  ];
}


function expectedCallsChild(keyword, i) {
  return [
    [schema[keyword][i], `/${keyword}/${i}`, schema, '', keyword, schema, i],
    [schema[keyword][i].properties[`foo_${keyword}_${i}`], `/${keyword}/${i}/properties/foo_${keyword}_${i}`, schema, `/${keyword}/${i}`, 'properties', schema[keyword][i], `foo_${keyword}_${i}`],
    [schema[keyword][i].properties[`bar_${keyword}_${i}`], `/${keyword}/${i}/properties/bar_${keyword}_${i}`, schema, `/${keyword}/${i}`, 'properties', schema[keyword][i], `bar_${keyword}_${i}`],
    [schema[keyword][i].anyOf[0], `/${keyword}/${i}/anyOf/0`, schema, `/${keyword}/${i}`, 'anyOf', schema[keyword][i], 0],
    [schema[keyword][i].anyOf[1], `/${keyword}/${i}/anyOf/1`, schema, `/${keyword}/${i}`, 'anyOf', schema[keyword][i], 1]
  ];
}
'use strict';

var traverse = require('../index');
var assert = require('assert');

describe('json-schema-traverse', function() {
  var calls;

  beforeEach(function() {
    calls = [];
  });

  it('should traverse all keywords containing schemas recursively', function() {
    var schema = require('./fixtures/schema').schema;
    var expectedCalls = require('./fixtures/schema').expectedCalls;

    traverse(schema, {cb: callback});
    assert.deepStrictEqual(calls, expectedCalls);
  });

  describe('Legacy v0.3.1 API', function() {
    it('should traverse all keywords containing schemas recursively', function() {
      var schema = require('./fixtures/schema').schema;
      var expectedCalls = require('./fixtures/schema').expectedCalls;

      traverse(schema, callback);
      assert.deepStrictEqual(calls, expectedCalls);
    });

    it('should work when an options object is provided', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var schema = require('./fixtures/schema').schema;
      var expectedCalls = require('./fixtures/schema').expectedCalls;

      traverse(schema, {}, callback);
      assert.deepStrictEqual(calls, expectedCalls);
    });
  });


  describe('allKeys option', function() {
    var schema = {
      someObject: {
        minimum: 1,
        maximum: 2
      }
    };

    it('should traverse objects with allKeys: true option', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema, '', schema, undefined, undefined, undefined, undefined],
        [schema.someObject, '/someObject', schema, '', 'someObject', schema, undefined]
      ];

      traverse(schema, {allKeys: true, cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });


    it('should NOT traverse objects with allKeys: false option', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema, '', schema, undefined, undefined, undefined, undefined]
      ];

      traverse(schema, {allKeys: false, cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });


    it('should NOT traverse objects without allKeys option', function() {
      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema, '', schema, undefined, undefined, undefined, undefined]
      ];

      traverse(schema, {cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });


    it('should NOT travers objects in standard keywords which value is not a schema', function() {
      var schema2 = {
        const: {foo: 'bar'},
        enum: ['a', 'b'],
        required: ['foo'],
        another: {

        },
        patternProperties: {}, // will not traverse - no properties
        dependencies: true, // will not traverse - invalid
        properties: {
          smaller: {
            type: 'number'
          },
          larger: {
            type: 'number',
            minimum: {$data: '1/smaller'}
          }
        }
      };

      // schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex
      var expectedCalls = [
        [schema2, '', schema2, undefined, undefined, undefined, undefined],
        [schema2.another, '/another', schema2, '', 'another', schema2, undefined],
        [schema2.properties.smaller, '/properties/smaller', schema2, '', 'properties', schema2, 'smaller'],
        [schema2.properties.larger, '/properties/larger', schema2, '', 'properties', schema2, 'larger'],
      ];

      traverse(schema2, {allKeys: true, cb: callback});
      assert.deepStrictEqual(calls, expectedCalls);
    });
  });

  describe('pre and post', function() {
    var schema = {
      type: 'object',
      properties: {
        name: {type: 'string'},
        age: {type: 'number'}
      }
    };

    it('should traverse schema in pre-order', function() {
      traverse(schema, {cb: {pre}});
      var expectedCalls = [
        ['pre', schema, '', schema, undefined, undefined, undefined, undefined],
        ['pre', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['pre', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
      ];
      assert.deepStrictEqual(calls, expectedCalls);
    });

    it('should traverse schema in post-order', function() {
      traverse(schema, {cb: {post}});
      var expectedCalls = [
        ['post', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['post', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
        ['post', schema, '', schema, undefined, undefined, undefined, undefined],
      ];
      assert.deepStrictEqual(calls, expectedCalls);
    });

    it('should traverse schema in pre- and post-order at the same time', function() {
      traverse(schema, {cb: {pre, post}});
      var expectedCalls = [
        ['pre', schema, '', schema, undefined, undefined, undefined, undefined],
        ['pre', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['post', schema.properties.name, '/properties/name', schema, '', 'properties', schema, 'name'],
        ['pre', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
        ['post', schema.properties.age, '/properties/age', schema, '', 'properties', schema, 'age'],
        ['post', schema, '', schema, undefined, undefined, undefined, undefined],
      ];
      assert.deepStrictEqual(calls, expectedCalls);
    });
  });

  function callback() {
    calls.push(Array.prototype.slice.call(arguments));
  }

  function pre() {
    calls.push(['pre'].concat(Array.prototype.slice.call(arguments)));
  }

  function post() {
    calls.push(['post'].concat(Array.prototype.slice.call(arguments)));
  }
});
BSD-2-Clause License

Copyright (c) 2018 IETF Trust, Austin Wright, Henry Andrews, Geraint Luff,
and Cloudflare, Inc. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
   this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

(function (JSONSchemaFormat) {
  JSONSchemaFormat["Date"] = "date";
  JSONSchemaFormat["DateTime"] = "date-time";
  JSONSchemaFormat["Email"] = "email";
  JSONSchemaFormat["Hostname"] = "hostname";
  JSONSchemaFormat["IDNEmail"] = "idn-email";
  JSONSchemaFormat["IDNHostname"] = "idn-hostname";
  JSONSchemaFormat["IPv4"] = "ipv4";
  JSONSchemaFormat["IPv6"] = "ipv6";
  JSONSchemaFormat["IRI"] = "iri";
  JSONSchemaFormat["IRIReference"] = "iri-reference";
  JSONSchemaFormat["JSONPointer"] = "json-pointer";
  JSONSchemaFormat["JSONPointerURIFragment"] = "json-pointer-uri-fragment";
  JSONSchemaFormat["RegEx"] = "regex";
  JSONSchemaFormat["RelativeJSONPointer"] = "relative-json-pointer";
  JSONSchemaFormat["Time"] = "time";
  JSONSchemaFormat["URI"] = "uri";
  JSONSchemaFormat["URIReference"] = "uri-reference";
  JSONSchemaFormat["URITemplate"] = "uri-template";
  JSONSchemaFormat["UUID"] = "uuid";
})(exports.JSONSchemaFormat || (exports.JSONSchemaFormat = {}));

(function (JSONSchemaType) {
  JSONSchemaType["Array"] = "array";
  JSONSchemaType["Boolean"] = "boolean";
  JSONSchemaType["Integer"] = "integer";
  JSONSchemaType["Null"] = "null";
  JSONSchemaType["Number"] = "number";
  JSONSchemaType["Object"] = "object";
  JSONSchemaType["String"] = "string";
})(exports.JSONSchemaType || (exports.JSONSchemaType = {}));

(function (JSONSchemaContentEncoding) {
  JSONSchemaContentEncoding["7bit"] = "7bit";
  JSONSchemaContentEncoding["8bit"] = "8bit";
  JSONSchemaContentEncoding["Binary"] = "binary";
  JSONSchemaContentEncoding["QuotedPrintable"] = "quoted-printable";
  JSONSchemaContentEncoding["Base64"] = "base64";
  JSONSchemaContentEncoding["IETFToken"] = "ietf-token";
  JSONSchemaContentEncoding["XToken"] = "x-token";
})(exports.JSONSchemaContentEncoding || (exports.JSONSchemaContentEncoding = {}));

const JSONSchemaKeys = ['$comment', '$id', '$ref', '$schema', 'additionalItems', 'additionalProperties', 'allOf', 'anyOf', 'const', 'contains', 'contentEncoding', 'contentMediaType', 'default', 'definitions', 'dependencies', 'description', 'else', 'enum', 'examples', 'exclusiveMaximum', 'exclusiveMinimum', 'format', 'if', 'items', 'maximum', 'maxItems', 'maxLength', 'maxProperties', 'minimum', 'minItems', 'minLength', 'minProperties', 'multipleOf', 'not', 'oneOf', 'pattern', 'patternProperties', 'properties', 'propertyNames', 'readOnly', 'required', 'then', 'title', 'type', 'uniqueItems', 'writeOnly'];

exports.JSONSchemaKeys = JSONSchemaKeys;
//# sourceMappingURL=index.js.map
"use strict";

export let JSONSchemaFormat;

(function (JSONSchemaFormat) {
  JSONSchemaFormat["Date"] = "date";
  JSONSchemaFormat["DateTime"] = "date-time";
  JSONSchemaFormat["Email"] = "email";
  JSONSchemaFormat["Hostname"] = "hostname";
  JSONSchemaFormat["IDNEmail"] = "idn-email";
  JSONSchemaFormat["IDNHostname"] = "idn-hostname";
  JSONSchemaFormat["IPv4"] = "ipv4";
  JSONSchemaFormat["IPv6"] = "ipv6";
  JSONSchemaFormat["IRI"] = "iri";
  JSONSchemaFormat["IRIReference"] = "iri-reference";
  JSONSchemaFormat["JSONPointer"] = "json-pointer";
  JSONSchemaFormat["JSONPointerURIFragment"] = "json-pointer-uri-fragment";
  JSONSchemaFormat["RegEx"] = "regex";
  JSONSchemaFormat["RelativeJSONPointer"] = "relative-json-pointer";
  JSONSchemaFormat["Time"] = "time";
  JSONSchemaFormat["URI"] = "uri";
  JSONSchemaFormat["URIReference"] = "uri-reference";
  JSONSchemaFormat["URITemplate"] = "uri-template";
  JSONSchemaFormat["UUID"] = "uuid";
})(JSONSchemaFormat || (JSONSchemaFormat = {}));

export let JSONSchemaType;

(function (JSONSchemaType) {
  JSONSchemaType["Array"] = "array";
  JSONSchemaType["Boolean"] = "boolean";
  JSONSchemaType["Integer"] = "integer";
  JSONSchemaType["Null"] = "null";
  JSONSchemaType["Number"] = "number";
  JSONSchemaType["Object"] = "object";
  JSONSchemaType["String"] = "string";
})(JSONSchemaType || (JSONSchemaType = {}));

export let JSONSchemaContentEncoding;

(function (JSONSchemaContentEncoding) {
  JSONSchemaContentEncoding["7bit"] = "7bit";
  JSONSchemaContentEncoding["8bit"] = "8bit";
  JSONSchemaContentEncoding["Binary"] = "binary";
  JSONSchemaContentEncoding["QuotedPrintable"] = "quoted-printable";
  JSONSchemaContentEncoding["Base64"] = "base64";
  JSONSchemaContentEncoding["IETFToken"] = "ietf-token";
  JSONSchemaContentEncoding["XToken"] = "x-token";
})(JSONSchemaContentEncoding || (JSONSchemaContentEncoding = {}));

export const JSONSchemaKeys = ['$comment', '$id', '$ref', '$schema', 'additionalItems', 'additionalProperties', 'allOf', 'anyOf', 'const', 'contains', 'contentEncoding', 'contentMediaType', 'default', 'definitions', 'dependencies', 'description', 'else', 'enum', 'examples', 'exclusiveMaximum', 'exclusiveMinimum', 'format', 'if', 'items', 'maximum', 'maxItems', 'maxLength', 'maxProperties', 'minimum', 'minItems', 'minLength', 'minProperties', 'multipleOf', 'not', 'oneOf', 'pattern', 'patternProperties', 'properties', 'propertyNames', 'readOnly', 'required', 'then', 'title', 'type', 'uniqueItems', 'writeOnly'];let JSONSchemaFormat;

(function (JSONSchemaFormat) {
  JSONSchemaFormat["Date"] = "date";
  JSONSchemaFormat["DateTime"] = "date-time";
  JSONSchemaFormat["Email"] = "email";
  JSONSchemaFormat["Hostname"] = "hostname";
  JSONSchemaFormat["IDNEmail"] = "idn-email";
  JSONSchemaFormat["IDNHostname"] = "idn-hostname";
  JSONSchemaFormat["IPv4"] = "ipv4";
  JSONSchemaFormat["IPv6"] = "ipv6";
  JSONSchemaFormat["IRI"] = "iri";
  JSONSchemaFormat["IRIReference"] = "iri-reference";
  JSONSchemaFormat["JSONPointer"] = "json-pointer";
  JSONSchemaFormat["JSONPointerURIFragment"] = "json-pointer-uri-fragment";
  JSONSchemaFormat["RegEx"] = "regex";
  JSONSchemaFormat["RelativeJSONPointer"] = "relative-json-pointer";
  JSONSchemaFormat["Time"] = "time";
  JSONSchemaFormat["URI"] = "uri";
  JSONSchemaFormat["URIReference"] = "uri-reference";
  JSONSchemaFormat["URITemplate"] = "uri-template";
  JSONSchemaFormat["UUID"] = "uuid";
})(JSONSchemaFormat || (JSONSchemaFormat = {}));

let JSONSchemaType;

(function (JSONSchemaType) {
  JSONSchemaType["Array"] = "array";
  JSONSchemaType["Boolean"] = "boolean";
  JSONSchemaType["Integer"] = "integer";
  JSONSchemaType["Null"] = "null";
  JSONSchemaType["Number"] = "number";
  JSONSchemaType["Object"] = "object";
  JSONSchemaType["String"] = "string";
})(JSONSchemaType || (JSONSchemaType = {}));

let JSONSchemaContentEncoding;

(function (JSONSchemaContentEncoding) {
  JSONSchemaContentEncoding["7bit"] = "7bit";
  JSONSchemaContentEncoding["8bit"] = "8bit";
  JSONSchemaContentEncoding["Binary"] = "binary";
  JSONSchemaContentEncoding["QuotedPrintable"] = "quoted-printable";
  JSONSchemaContentEncoding["Base64"] = "base64";
  JSONSchemaContentEncoding["IETFToken"] = "ietf-token";
  JSONSchemaContentEncoding["XToken"] = "x-token";
})(JSONSchemaContentEncoding || (JSONSchemaContentEncoding = {}));

const JSONSchemaKeys = ['$comment', '$id', '$ref', '$schema', 'additionalItems', 'additionalProperties', 'allOf', 'anyOf', 'const', 'contains', 'contentEncoding', 'contentMediaType', 'default', 'definitions', 'dependencies', 'description', 'else', 'enum', 'examples', 'exclusiveMaximum', 'exclusiveMinimum', 'format', 'if', 'items', 'maximum', 'maxItems', 'maxLength', 'maxProperties', 'minimum', 'minItems', 'minLength', 'minProperties', 'multipleOf', 'not', 'oneOf', 'pattern', 'patternProperties', 'properties', 'propertyNames', 'readOnly', 'required', 'then', 'title', 'type', 'uniqueItems', 'writeOnly'];

export { JSONSchemaContentEncoding, JSONSchemaFormat, JSONSchemaKeys, JSONSchemaType };
//# sourceMappingURL=index.js.map
{
  "name": "json-schema-typed",
  "description": "JSONSchema TypeScript definitions.",
  "version": "7.0.3",
  "license": "BSD-2-Clause",
  "files": [
    "dist-*/",
    "bin/"
  ],
  "pika": true,
  "sideEffects": false,
  "homepage": "https://github.com/typeslick/json-schema-typed",
  "repository": {
    "type": "git",
    "url": "https://github.com/typeslick/json-schema-typed.git"
  },
  "dependencies": {},
  "devDependencies": {
    "@babel/cli": "7.6.4",
    "@babel/core": "7.6.4",
    "@babel/runtime-corejs2": "7.6.3",
    "@loomble/cspell-dictionary": "1.0.0",
    "@microsoft/api-extractor": "7.3.4",
    "@pika/pack": "0.5.0",
    "@pika/plugin-build-node": "0.7.1",
    "@pika/plugin-build-types": "0.7.1",
    "@pika/plugin-build-web": "0.7.1",
    "@pika/plugin-standard-pkg": "0.7.1",
    "@types/babel__core": "7.1.3",
    "@types/jest": "24.0.20",
    "@types/jest-diff": "20.0.1",
    "@types/node": "12.11.7",
    "babel-core": "6.26.3",
    "babel-jest": "24.9.0",
    "babel-preset-slick": "7.0.4",
    "core-js": "3.3.4",
    "cspell": "4.0.31",
    "deep-sort-object": "1.0.2",
    "jest": "24.9.0",
    "jest-serializer-path": "0.1.15",
    "prettier": "1.18.2",
    "tsconfig-slick": "3.0.2",
    "tslint": "5.20.0",
    "tslint-slick": "5.0.0",
    "typedoc": "0.15.0",
    "typedoc-plugin-markdown": "2.2.11",
    "typescript": "3.6.4",
    "typescript-tslint-plugin": "0.5.4"
  },
  "esnext": "dist-src/index.js",
  "main": "dist-node/index.js",
  "module": "dist-web/index.js",
  "types": "dist-types/index.d.ts"
}'use strict';
const path = require('path');
const pathExists = require('path-exists');
const pLocate = require('p-locate');

module.exports = (iterable, options) => {
	options = Object.assign({
		cwd: process.cwd()
	}, options);

	return pLocate(iterable, el => pathExists(path.resolve(options.cwd, el)), options);
};

module.exports.sync = (iterable, options) => {
	options = Object.assign({
		cwd: process.cwd()
	}, options);

	for (const el of iterable) {
		if (pathExists.sync(path.resolve(options.cwd, el))) {
			return el;
		}
	}
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "locate-path",
  "version": "3.0.0",
  "description": "Get the first path that exists on disk of multiple paths",
  "license": "MIT",
  "repository": "sindresorhus/locate-path",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "dependencies": {
    "p-locate": "^3.0.0",
    "path-exists": "^3.0.0"
  },
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  }
}'use strict';

const copyProperty = (to, from, property, ignoreNonConfigurable) => {
	// `Function#length` should reflect the parameters of `to` not `from` since we keep its body.
	// `Function#prototype` is non-writable and non-configurable so can never be modified.
	if (property === 'length' || property === 'prototype') {
		return;
	}

	// `Function#arguments` and `Function#caller` should not be copied. They were reported to be present in `Reflect.ownKeys` for some devices in React Native (#41), so we explicitly ignore them here.
	if (property === 'arguments' || property === 'caller') {
		return;
	}

	const toDescriptor = Object.getOwnPropertyDescriptor(to, property);
	const fromDescriptor = Object.getOwnPropertyDescriptor(from, property);

	if (!canCopyProperty(toDescriptor, fromDescriptor) && ignoreNonConfigurable) {
		return;
	}

	Object.defineProperty(to, property, fromDescriptor);
};

// `Object.defineProperty()` throws if the property exists, is not configurable and either:
//  - one its descriptors is changed
//  - it is non-writable and its value is changed
const canCopyProperty = function (toDescriptor, fromDescriptor) {
	return toDescriptor === undefined || toDescriptor.configurable || (
		toDescriptor.writable === fromDescriptor.writable &&
		toDescriptor.enumerable === fromDescriptor.enumerable &&
		toDescriptor.configurable === fromDescriptor.configurable &&
		(toDescriptor.writable || toDescriptor.value === fromDescriptor.value)
	);
};

const changePrototype = (to, from) => {
	const fromPrototype = Object.getPrototypeOf(from);
	if (fromPrototype === Object.getPrototypeOf(to)) {
		return;
	}

	Object.setPrototypeOf(to, fromPrototype);
};

const wrappedToString = (withName, fromBody) => `/* Wrapped ${withName}*/\n${fromBody}`;

const toStringDescriptor = Object.getOwnPropertyDescriptor(Function.prototype, 'toString');
const toStringName = Object.getOwnPropertyDescriptor(Function.prototype.toString, 'name');

// We call `from.toString()` early (not lazily) to ensure `from` can be garbage collected.
// We use `bind()` instead of a closure for the same reason.
// Calling `from.toString()` early also allows caching it in case `to.toString()` is called several times.
const changeToString = (to, from, name) => {
	const withName = name === '' ? '' : `with ${name.trim()}() `;
	const newToString = wrappedToString.bind(null, withName, from.toString());
	// Ensure `to.toString.toString` is non-enumerable and has the same `same`
	Object.defineProperty(newToString, 'name', toStringName);
	Object.defineProperty(to, 'toString', {...toStringDescriptor, value: newToString});
};

const mimicFn = (to, from, {ignoreNonConfigurable = false} = {}) => {
	const {name} = to;

	for (const property of Reflect.ownKeys(from)) {
		copyProperty(to, from, property, ignoreNonConfigurable);
	}

	changePrototype(to, from);
	changeToString(to, from, name);

	return to;
};

module.exports = mimicFn;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "mimic-fn",
  "version": "3.1.0",
  "description": "Make a function mimic another one",
  "license": "MIT",
  "repository": "sindresorhus/mimic-fn",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "devDependencies": {
    "ava": "^2.1.0",
    "tsd": "^0.7.1",
    "xo": "^0.24.0"
  }
}'use strict';
const mimicFn = require('mimic-fn');

const calledFunctions = new WeakMap();

const onetime = (function_, options = {}) => {
	if (typeof function_ !== 'function') {
		throw new TypeError('Expected a function');
	}

	let returnValue;
	let callCount = 0;
	const functionName = function_.displayName || function_.name || '<anonymous>';

	const onetime = function (...arguments_) {
		calledFunctions.set(onetime, ++callCount);

		if (callCount === 1) {
			returnValue = function_.apply(this, arguments_);
			function_ = null;
		} else if (options.throw === true) {
			throw new Error(`Function \`${functionName}\` can only be called once`);
		}

		return returnValue;
	};

	mimicFn(onetime, function_);
	calledFunctions.set(onetime, callCount);

	return onetime;
};

module.exports = onetime;
// TODO: Remove this for the next major release
module.exports.default = onetime;

module.exports.callCount = function_ => {
	if (!calledFunctions.has(function_)) {
		throw new Error(`The given function \`${function_.name}\` is not wrapped by the \`onetime\` package`);
	}

	return calledFunctions.get(function_);
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "onetime",
  "version": "5.1.2",
  "description": "Ensure a function is only called once",
  "license": "MIT",
  "repository": "sindresorhus/onetime",
  "funding": "https://github.com/sponsors/sindresorhus",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "dependencies": {
    "mimic-fn": "^2.1.0"
  },
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.1",
    "xo": "^0.24.0"
  }
}'use strict';

const mimicFn = (to, from) => {
	for (const prop of Reflect.ownKeys(from)) {
		Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop));
	}

	return to;
};

module.exports = mimicFn;
// TODO: Remove this for the next major release
module.exports.default = mimicFn;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "mimic-fn",
  "version": "2.1.0",
  "description": "Make a function mimic another one",
  "license": "MIT",
  "repository": "sindresorhus/mimic-fn",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.1",
    "xo": "^0.24.0"
  }
}'use strict';
const pTry = require('p-try');

const pLimit = concurrency => {
	if (!((Number.isInteger(concurrency) || concurrency === Infinity) && concurrency > 0)) {
		return Promise.reject(new TypeError('Expected `concurrency` to be a number from 1 and up'));
	}

	const queue = [];
	let activeCount = 0;

	const next = () => {
		activeCount--;

		if (queue.length > 0) {
			queue.shift()();
		}
	};

	const run = (fn, resolve, ...args) => {
		activeCount++;

		const result = pTry(fn, ...args);

		resolve(result);

		result.then(next, next);
	};

	const enqueue = (fn, resolve, ...args) => {
		if (activeCount < concurrency) {
			run(fn, resolve, ...args);
		} else {
			queue.push(run.bind(null, fn, resolve, ...args));
		}
	};

	const generator = (fn, ...args) => new Promise(resolve => enqueue(fn, resolve, ...args));
	Object.defineProperties(generator, {
		activeCount: {
			get: () => activeCount
		},
		pendingCount: {
			get: () => queue.length
		},
		clearQueue: {
			value: () => {
				queue.length = 0;
			}
		}
	});

	return generator;
};

module.exports = pLimit;
module.exports.default = pLimit;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "p-limit",
  "version": "2.3.0",
  "description": "Run multiple promise-returning & async functions with limited concurrency",
  "license": "MIT",
  "repository": "sindresorhus/p-limit",
  "funding": "https://github.com/sponsors/sindresorhus",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "dependencies": {
    "p-try": "^2.0.0"
  },
  "devDependencies": {
    "ava": "^1.2.1",
    "delay": "^4.1.0",
    "in-range": "^1.0.0",
    "random-int": "^1.0.0",
    "time-span": "^2.0.0",
    "tsd-check": "^0.3.0",
    "xo": "^0.24.0"
  }
}'use strict';
const pLimit = require('p-limit');

class EndError extends Error {
	constructor(value) {
		super();
		this.value = value;
	}
}

// The input can also be a promise, so we `Promise.resolve()` it
const testElement = (el, tester) => Promise.resolve(el).then(tester);

// The input can also be a promise, so we `Promise.all()` them both
const finder = el => Promise.all(el).then(val => val[1] === true && Promise.reject(new EndError(val[0])));

module.exports = (iterable, tester, opts) => {
	opts = Object.assign({
		concurrency: Infinity,
		preserveOrder: true
	}, opts);

	const limit = pLimit(opts.concurrency);

	// Start all the promises concurrently with optional limit
	const items = [...iterable].map(el => [el, limit(testElement, el, tester)]);

	// Check the promises either serially or concurrently
	const checkLimit = pLimit(opts.preserveOrder ? 1 : Infinity);

	return Promise.all(items.map(el => checkLimit(finder, el)))
		.then(() => {})
		.catch(err => err instanceof EndError ? err.value : Promise.reject(err));
};
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "p-locate",
  "version": "3.0.0",
  "description": "Get the first fulfilled promise that satisfies the provided testing function",
  "license": "MIT",
  "repository": "sindresorhus/p-locate",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js"
  ],
  "dependencies": {
    "p-limit": "^2.0.0"
  },
  "devDependencies": {
    "ava": "*",
    "delay": "^3.0.0",
    "in-range": "^1.0.0",
    "time-span": "^2.0.0",
    "xo": "*"
  }
}'use strict';

const pTry = (fn, ...arguments_) => new Promise(resolve => {
	resolve(fn(...arguments_));
});

module.exports = pTry;
// TODO: remove this in the next major version
module.exports.default = pTry;
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "p-try",
  "version": "2.2.0",
  "description": "`Start a promise chain",
  "license": "MIT",
  "repository": "sindresorhus/p-try",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=6"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.1",
    "xo": "^0.24.0"
  }
}'use strict';
const fs = require('fs');

module.exports = fp => new Promise(resolve => {
	fs.access(fp, err => {
		resolve(!err);
	});
});

module.exports.sync = fp => {
	try {
		fs.accessSync(fp);
		return true;
	} catch (err) {
		return false;
	}
};
The MIT License (MIT)

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "name": "path-exists",
  "version": "3.0.0",
  "description": "Check if a path exists",
  "license": "MIT",
  "repository": "sindresorhus/path-exists",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=4"
  },
  "files": [
    "index.js"
  ],
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  }
}'use strict';
const findUp = require('find-up');

module.exports = async ({cwd} = {}) => findUp('package.json', {cwd});
module.exports.sync = ({cwd} = {}) => findUp.sync('package.json', {cwd});
MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "pkg-up",
  "version": "3.1.0",
  "description": "Find the closest package.json file",
  "license": "MIT",
  "repository": "sindresorhus/pkg-up",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "dependencies": {
    "find-up": "^3.0.0"
  },
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.2",
    "xo": "^0.24.0"
  }
}'use strict';

var Module = require('module');
var path = require('path');

module.exports = function requireFromString(code, filename, opts) {
	if (typeof filename === 'object') {
		opts = filename;
		filename = undefined;
	}

	opts = opts || {};
	filename = filename || '';

	opts.appendPaths = opts.appendPaths || [];
	opts.prependPaths = opts.prependPaths || [];

	if (typeof code !== 'string') {
		throw new Error('code must be a string, not ' + typeof code);
	}

	var paths = Module._nodeModulePaths(path.dirname(filename));

	var parent = module.parent;
	var m = new Module(filename, parent);
	m.filename = filename;
	m.paths = [].concat(opts.prependPaths).concat(paths).concat(opts.appendPaths);
	m._compile(code, filename);

	var exports = m.exports;
	parent && parent.children && parent.children.splice(parent.children.indexOf(m), 1);

	return exports;
};
The MIT License (MIT)

Copyright (c) Vsevolod Strukchinsky <floatdrop@gmail.com> (github.com/floatdrop)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
{
  "name": "require-from-string",
  "version": "2.0.2",
  "description": "Require module from string",
  "license": "MIT",
  "repository": "floatdrop/require-from-string",
  "author": {
    "name": "Vsevolod Strukchinsky",
    "email": "floatdrop@gmail.com",
    "url": "github.com/floatdrop"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "dependencies": {},
  "devDependencies": {
    "mocha": "*"
  }
}The ISC License

Copyright (c) Isaac Z. Schlueter and Contributors

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#!/usr/bin/env node
// Standalone semver comparison program.
// Exits successfully and prints matching version(s) if
// any supplied version is valid and passes all tests.

'use strict'

const argv = process.argv.slice(2)

let versions = []

const range = []

let inc = null

const version = require('../package.json').version

let loose = false

let includePrerelease = false

let coerce = false

let rtl = false

let identifier

let identifierBase

const semver = require('../')
const parseOptions = require('../internal/parse-options')

let reverse = false

let options = {}

const main = () => {
  if (!argv.length) {
    return help()
  }
  while (argv.length) {
    let a = argv.shift()
    const indexOfEqualSign = a.indexOf('=')
    if (indexOfEqualSign !== -1) {
      const value = a.slice(indexOfEqualSign + 1)
      a = a.slice(0, indexOfEqualSign)
      argv.unshift(value)
    }
    switch (a) {
      case '-rv': case '-rev': case '--rev': case '--reverse':
        reverse = true
        break
      case '-l': case '--loose':
        loose = true
        break
      case '-p': case '--include-prerelease':
        includePrerelease = true
        break
      case '-v': case '--version':
        versions.push(argv.shift())
        break
      case '-i': case '--inc': case '--increment':
        switch (argv[0]) {
          case 'major': case 'minor': case 'patch': case 'prerelease':
          case 'premajor': case 'preminor': case 'prepatch':
          case 'release':
            inc = argv.shift()
            break
          default:
            inc = 'patch'
            break
        }
        break
      case '--preid':
        identifier = argv.shift()
        break
      case '-r': case '--range':
        range.push(argv.shift())
        break
      case '-n':
        identifierBase = argv.shift()
        if (identifierBase === 'false') {
          identifierBase = false
        }
        break
      case '-c': case '--coerce':
        coerce = true
        break
      case '--rtl':
        rtl = true
        break
      case '--ltr':
        rtl = false
        break
      case '-h': case '--help': case '-?':
        return help()
      default:
        versions.push(a)
        break
    }
  }

  options = parseOptions({ loose, includePrerelease, rtl })

  versions = versions.map((v) => {
    return coerce ? (semver.coerce(v, options) || { version: v }).version : v
  }).filter((v) => {
    return semver.valid(v, options)
  })
  if (!versions.length) {
    return fail()
  }
  if (inc && (versions.length !== 1 || range.length)) {
    return failInc()
  }

  for (let i = 0, l = range.length; i < l; i++) {
    versions = versions.filter((v) => {
      return semver.satisfies(v, range[i], options)
    })
    if (!versions.length) {
      return fail()
    }
  }
  versions
    .sort((a, b) => semver[reverse ? 'rcompare' : 'compare'](a, b, options))
    .map(v => semver.clean(v, options))
    .map(v => inc ? semver.inc(v, inc, options, identifier, identifierBase) : v)
    .forEach(v => console.log(v))
}

const failInc = () => {
  console.error('--inc can only be used on a single version with no range')
  fail()
}

const fail = () => process.exit(1)

const help = () => console.log(
`SemVer ${version}

A JavaScript implementation of the https://semver.org/ specification
Copyright Isaac Z. Schlueter

Usage: semver [options] <version> [<version> [...]]
Prints valid versions sorted by SemVer precedence

Options:
-r --range <range>
        Print versions that match the specified range.

-i --increment [<level>]
        Increment a version by the specified level.  Level can
        be one of: major, minor, patch, premajor, preminor,
        prepatch, prerelease, or release.  Default level is 'patch'.
        Only one version may be specified.

--preid <identifier>
        Identifier to be used to prefix premajor, preminor,
        prepatch or prerelease version increments.

-l --loose
        Interpret versions and ranges loosely

-p --include-prerelease
        Always include prerelease versions in range matching

-c --coerce
        Coerce a string into SemVer if possible
        (does not imply --loose)

--rtl
        Coerce version strings right to left

--ltr
        Coerce version strings left to right (default)

-n <base>
        Base number to be used for the prerelease identifier.
        Can be either 0 or 1, or false to omit the number altogether.
        Defaults to 0.

Program exits successfully if any valid version satisfies
all supplied ranges, and prints all satisfying versions.

If no satisfying versions are found, then exits failure.

Versions are printed in ascending order, so supplying
multiple versions to the utility will just sort them.`)

main()
'use strict'

const ANY = Symbol('SemVer ANY')
// hoisted class for cyclic dependency
class Comparator {
  static get ANY () {
    return ANY
  }

  constructor (comp, options) {
    options = parseOptions(options)

    if (comp instanceof Comparator) {
      if (comp.loose === !!options.loose) {
        return comp
      } else {
        comp = comp.value
      }
    }

    comp = comp.trim().split(/\s+/).join(' ')
    debug('comparator', comp, options)
    this.options = options
    this.loose = !!options.loose
    this.parse(comp)

    if (this.semver === ANY) {
      this.value = ''
    } else {
      this.value = this.operator + this.semver.version
    }

    debug('comp', this)
  }

  parse (comp) {
    const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
    const m = comp.match(r)

    if (!m) {
      throw new TypeError(`Invalid comparator: ${comp}`)
    }

    this.operator = m[1] !== undefined ? m[1] : ''
    if (this.operator === '=') {
      this.operator = ''
    }

    // if it literally is just '>' or '' then allow anything.
    if (!m[2]) {
      this.semver = ANY
    } else {
      this.semver = new SemVer(m[2], this.options.loose)
    }
  }

  toString () {
    return this.value
  }

  test (version) {
    debug('Comparator.test', version, this.options.loose)

    if (this.semver === ANY || version === ANY) {
      return true
    }

    if (typeof version === 'string') {
      try {
        version = new SemVer(version, this.options)
      } catch (er) {
        return false
      }
    }

    return cmp(version, this.operator, this.semver, this.options)
  }

  intersects (comp, options) {
    if (!(comp instanceof Comparator)) {
      throw new TypeError('a Comparator is required')
    }

    if (this.operator === '') {
      if (this.value === '') {
        return true
      }
      return new Range(comp.value, options).test(this.value)
    } else if (comp.operator === '') {
      if (comp.value === '') {
        return true
      }
      return new Range(this.value, options).test(comp.semver)
    }

    options = parseOptions(options)

    // Special cases where nothing can possibly be lower
    if (options.includePrerelease &&
      (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {
      return false
    }
    if (!options.includePrerelease &&
      (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {
      return false
    }

    // Same direction increasing (> or >=)
    if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {
      return true
    }
    // Same direction decreasing (< or <=)
    if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {
      return true
    }
    // same SemVer and both sides are inclusive (<= or >=)
    if (
      (this.semver.version === comp.semver.version) &&
      this.operator.includes('=') && comp.operator.includes('=')) {
      return true
    }
    // opposite directions less than
    if (cmp(this.semver, '<', comp.semver, options) &&
      this.operator.startsWith('>') && comp.operator.startsWith('<')) {
      return true
    }
    // opposite directions greater than
    if (cmp(this.semver, '>', comp.semver, options) &&
      this.operator.startsWith('<') && comp.operator.startsWith('>')) {
      return true
    }
    return false
  }
}

module.exports = Comparator

const parseOptions = require('../internal/parse-options')
const { safeRe: re, t } = require('../internal/re')
const cmp = require('../functions/cmp')
const debug = require('../internal/debug')
const SemVer = require('./semver')
const Range = require('./range')
'use strict'

module.exports = {
  SemVer: require('./semver.js'),
  Range: require('./range.js'),
  Comparator: require('./comparator.js'),
}
'use strict'

const SPACE_CHARACTERS = /\s+/g

// hoisted class for cyclic dependency
class Range {
  constructor (range, options) {
    options = parseOptions(options)

    if (range instanceof Range) {
      if (
        range.loose === !!options.loose &&
        range.includePrerelease === !!options.includePrerelease
      ) {
        return range
      } else {
        return new Range(range.raw, options)
      }
    }

    if (range instanceof Comparator) {
      // just put it in the set and return
      this.raw = range.value
      this.set = [[range]]
      this.formatted = undefined
      return this
    }

    this.options = options
    this.loose = !!options.loose
    this.includePrerelease = !!options.includePrerelease

    // First reduce all whitespace as much as possible so we do not have to rely
    // on potentially slow regexes like \s*. This is then stored and used for
    // future error messages as well.
    this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')

    // First, split on ||
    this.set = this.raw
      .split('||')
      // map the range to a 2d array of comparators
      .map(r => this.parseRange(r.trim()))
      // throw out any comparator lists that are empty
      // this generally means that it was not a valid range, which is allowed
      // in loose mode, but will still throw if the WHOLE range is invalid.
      .filter(c => c.length)

    if (!this.set.length) {
      throw new TypeError(`Invalid SemVer Range: ${this.raw}`)
    }

    // if we have any that are not the null set, throw out null sets.
    if (this.set.length > 1) {
      // keep the first one, in case they're all null sets
      const first = this.set[0]
      this.set = this.set.filter(c => !isNullSet(c[0]))
      if (this.set.length === 0) {
        this.set = [first]
      } else if (this.set.length > 1) {
        // if we have any that are *, then the range is just *
        for (const c of this.set) {
          if (c.length === 1 && isAny(c[0])) {
            this.set = [c]
            break
          }
        }
      }
    }

    this.formatted = undefined
  }

  get range () {
    if (this.formatted === undefined) {
      this.formatted = ''
      for (let i = 0; i < this.set.length; i++) {
        if (i > 0) {
          this.formatted += '||'
        }
        const comps = this.set[i]
        for (let k = 0; k < comps.length; k++) {
          if (k > 0) {
            this.formatted += ' '
          }
          this.formatted += comps[k].toString().trim()
        }
      }
    }
    return this.formatted
  }

  format () {
    return this.range
  }

  toString () {
    return this.range
  }

  parseRange (range) {
    // memoize range parsing for performance.
    // this is a very hot path, and fully deterministic.
    const memoOpts =
      (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |
      (this.options.loose && FLAG_LOOSE)
    const memoKey = memoOpts + ':' + range
    const cached = cache.get(memoKey)
    if (cached) {
      return cached
    }

    const loose = this.options.loose
    // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
    const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
    range = range.replace(hr, hyphenReplace(this.options.includePrerelease))
    debug('hyphen replace', range)

    // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
    range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
    debug('comparator trim', range)

    // `~ 1.2.3` => `~1.2.3`
    range = range.replace(re[t.TILDETRIM], tildeTrimReplace)
    debug('tilde trim', range)

    // `^ 1.2.3` => `^1.2.3`
    range = range.replace(re[t.CARETTRIM], caretTrimReplace)
    debug('caret trim', range)

    // At this point, the range is completely trimmed and
    // ready to be split into comparators.

    let rangeList = range
      .split(' ')
      .map(comp => parseComparator(comp, this.options))
      .join(' ')
      .split(/\s+/)
      // >=0.0.0 is equivalent to *
      .map(comp => replaceGTE0(comp, this.options))

    if (loose) {
      // in loose mode, throw out any that are not valid comparators
      rangeList = rangeList.filter(comp => {
        debug('loose invalid filter', comp, this.options)
        return !!comp.match(re[t.COMPARATORLOOSE])
      })
    }
    debug('range list', rangeList)

    // if any comparators are the null set, then replace with JUST null set
    // if more than one comparator, remove any * comparators
    // also, don't include the same comparator more than once
    const rangeMap = new Map()
    const comparators = rangeList.map(comp => new Comparator(comp, this.options))
    for (const comp of comparators) {
      if (isNullSet(comp)) {
        return [comp]
      }
      rangeMap.set(comp.value, comp)
    }
    if (rangeMap.size > 1 && rangeMap.has('')) {
      rangeMap.delete('')
    }

    const result = [...rangeMap.values()]
    cache.set(memoKey, result)
    return result
  }

  intersects (range, options) {
    if (!(range instanceof Range)) {
      throw new TypeError('a Range is required')
    }

    return this.set.some((thisComparators) => {
      return (
        isSatisfiable(thisComparators, options) &&
        range.set.some((rangeComparators) => {
          return (
            isSatisfiable(rangeComparators, options) &&
            thisComparators.every((thisComparator) => {
              return rangeComparators.every((rangeComparator) => {
                return thisComparator.intersects(rangeComparator, options)
              })
            })
          )
        })
      )
    })
  }

  // if ANY of the sets match ALL of its comparators, then pass
  test (version) {
    if (!version) {
      return false
    }

    if (typeof version === 'string') {
      try {
        version = new SemVer(version, this.options)
      } catch (er) {
        return false
      }
    }

    for (let i = 0; i < this.set.length; i++) {
      if (testSet(this.set[i], version, this.options)) {
        return true
      }
    }
    return false
  }
}

module.exports = Range

const LRU = require('../internal/lrucache')
const cache = new LRU()

const parseOptions = require('../internal/parse-options')
const Comparator = require('./comparator')
const debug = require('../internal/debug')
const SemVer = require('./semver')
const {
  safeRe: re,
  t,
  comparatorTrimReplace,
  tildeTrimReplace,
  caretTrimReplace,
} = require('../internal/re')
const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')

const isNullSet = c => c.value === '<0.0.0-0'
const isAny = c => c.value === ''

// take a set of comparators and determine whether there
// exists a version which can satisfy it
const isSatisfiable = (comparators, options) => {
  let result = true
  const remainingComparators = comparators.slice()
  let testComparator = remainingComparators.pop()

  while (result && remainingComparators.length) {
    result = remainingComparators.every((otherComparator) => {
      return testComparator.intersects(otherComparator, options)
    })

    testComparator = remainingComparators.pop()
  }

  return result
}

// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
const parseComparator = (comp, options) => {
  comp = comp.replace(re[t.BUILD], '')
  debug('comp', comp, options)
  comp = replaceCarets(comp, options)
  debug('caret', comp)
  comp = replaceTildes(comp, options)
  debug('tildes', comp)
  comp = replaceXRanges(comp, options)
  debug('xrange', comp)
  comp = replaceStars(comp, options)
  debug('stars', comp)
  return comp
}

const isX = id => !id || id.toLowerCase() === 'x' || id === '*'

// ~, ~> --> * (any, kinda silly)
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0
// ~0.0.1 --> >=0.0.1 <0.1.0-0
const replaceTildes = (comp, options) => {
  return comp
    .trim()
    .split(/\s+/)
    .map((c) => replaceTilde(c, options))
    .join(' ')
}

const replaceTilde = (comp, options) => {
  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]
  return comp.replace(r, (_, M, m, p, pr) => {
    debug('tilde', comp, _, M, m, p, pr)
    let ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = `>=${M}.0.0 <${+M + 1}.0.0-0`
    } else if (isX(p)) {
      // ~1.2 == >=1.2.0 <1.3.0-0
      ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`
    } else if (pr) {
      debug('replaceTilde pr', pr)
      ret = `>=${M}.${m}.${p}-${pr
      } <${M}.${+m + 1}.0-0`
    } else {
      // ~1.2.3 == >=1.2.3 <1.3.0-0
      ret = `>=${M}.${m}.${p
      } <${M}.${+m + 1}.0-0`
    }

    debug('tilde return', ret)
    return ret
  })
}

// ^ --> * (any, kinda silly)
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0
// ^1.2.3 --> >=1.2.3 <2.0.0-0
// ^1.2.0 --> >=1.2.0 <2.0.0-0
// ^0.0.1 --> >=0.0.1 <0.0.2-0
// ^0.1.0 --> >=0.1.0 <0.2.0-0
const replaceCarets = (comp, options) => {
  return comp
    .trim()
    .split(/\s+/)
    .map((c) => replaceCaret(c, options))
    .join(' ')
}

const replaceCaret = (comp, options) => {
  debug('caret', comp, options)
  const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]
  const z = options.includePrerelease ? '-0' : ''
  return comp.replace(r, (_, M, m, p, pr) => {
    debug('caret', comp, _, M, m, p, pr)
    let ret

    if (isX(M)) {
      ret = ''
    } else if (isX(m)) {
      ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`
    } else if (isX(p)) {
      if (M === '0') {
        ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`
      } else {
        ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`
      }
    } else if (pr) {
      debug('replaceCaret pr', pr)
      if (M === '0') {
        if (m === '0') {
          ret = `>=${M}.${m}.${p}-${pr
          } <${M}.${m}.${+p + 1}-0`
        } else {
          ret = `>=${M}.${m}.${p}-${pr
          } <${M}.${+m + 1}.0-0`
        }
      } else {
        ret = `>=${M}.${m}.${p}-${pr
        } <${+M + 1}.0.0-0`
      }
    } else {
      debug('no pr')
      if (M === '0') {
        if (m === '0') {
          ret = `>=${M}.${m}.${p
          }${z} <${M}.${m}.${+p + 1}-0`
        } else {
          ret = `>=${M}.${m}.${p
          }${z} <${M}.${+m + 1}.0-0`
        }
      } else {
        ret = `>=${M}.${m}.${p
        } <${+M + 1}.0.0-0`
      }
    }

    debug('caret return', ret)
    return ret
  })
}

const replaceXRanges = (comp, options) => {
  debug('replaceXRanges', comp, options)
  return comp
    .split(/\s+/)
    .map((c) => replaceXRange(c, options))
    .join(' ')
}

const replaceXRange = (comp, options) => {
  comp = comp.trim()
  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]
  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
    debug('xRange', comp, ret, gtlt, M, m, p, pr)
    const xM = isX(M)
    const xm = xM || isX(m)
    const xp = xm || isX(p)
    const anyX = xp

    if (gtlt === '=' && anyX) {
      gtlt = ''
    }

    // if we're including prereleases in the match, then we need
    // to fix this to -0, the lowest possible prerelease value
    pr = options.includePrerelease ? '-0' : ''

    if (xM) {
      if (gtlt === '>' || gtlt === '<') {
        // nothing is allowed
        ret = '<0.0.0-0'
      } else {
        // nothing is forbidden
        ret = '*'
      }
    } else if (gtlt && anyX) {
      // we know patch is an x, because we have any x at all.
      // replace X with 0
      if (xm) {
        m = 0
      }
      p = 0

      if (gtlt === '>') {
        // >1 => >=2.0.0
        // >1.2 => >=1.3.0
        gtlt = '>='
        if (xm) {
          M = +M + 1
          m = 0
          p = 0
        } else {
          m = +m + 1
          p = 0
        }
      } else if (gtlt === '<=') {
        // <=0.7.x is actually <0.8.0, since any 0.7.x should
        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
        gtlt = '<'
        if (xm) {
          M = +M + 1
        } else {
          m = +m + 1
        }
      }

      if (gtlt === '<') {
        pr = '-0'
      }

      ret = `${gtlt + M}.${m}.${p}${pr}`
    } else if (xm) {
      ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`
    } else if (xp) {
      ret = `>=${M}.${m}.0${pr
      } <${M}.${+m + 1}.0-0`
    }

    debug('xRange return', ret)

    return ret
  })
}

// Because * is AND-ed with everything else in the comparator,
// and '' means "any version", just remove the *s entirely.
const replaceStars = (comp, options) => {
  debug('replaceStars', comp, options)
  // Looseness is ignored here.  star is always as loose as it gets!
  return comp
    .trim()
    .replace(re[t.STAR], '')
}

const replaceGTE0 = (comp, options) => {
  debug('replaceGTE0', comp, options)
  return comp
    .trim()
    .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')
}

// This function is passed to string.replace(re[t.HYPHENRANGE])
// M, m, patch, prerelease, build
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0-0
// TODO build?
const hyphenReplace = incPr => ($0,
  from, fM, fm, fp, fpr, fb,
  to, tM, tm, tp, tpr) => {
  if (isX(fM)) {
    from = ''
  } else if (isX(fm)) {
    from = `>=${fM}.0.0${incPr ? '-0' : ''}`
  } else if (isX(fp)) {
    from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`
  } else if (fpr) {
    from = `>=${from}`
  } else {
    from = `>=${from}${incPr ? '-0' : ''}`
  }

  if (isX(tM)) {
    to = ''
  } else if (isX(tm)) {
    to = `<${+tM + 1}.0.0-0`
  } else if (isX(tp)) {
    to = `<${tM}.${+tm + 1}.0-0`
  } else if (tpr) {
    to = `<=${tM}.${tm}.${tp}-${tpr}`
  } else if (incPr) {
    to = `<${tM}.${tm}.${+tp + 1}-0`
  } else {
    to = `<=${to}`
  }

  return `${from} ${to}`.trim()
}

const testSet = (set, version, options) => {
  for (let i = 0; i < set.length; i++) {
    if (!set[i].test(version)) {
      return false
    }
  }

  if (version.prerelease.length && !options.includePrerelease) {
    // Find the set of versions that are allowed to have prereleases
    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
    // That should allow `1.2.3-pr.2` to pass.
    // However, `1.2.4-alpha.notready` should NOT be allowed,
    // even though it's within the range set by the comparators.
    for (let i = 0; i < set.length; i++) {
      debug(set[i].semver)
      if (set[i].semver === Comparator.ANY) {
        continue
      }

      if (set[i].semver.prerelease.length > 0) {
        const allowed = set[i].semver
        if (allowed.major === version.major &&
            allowed.minor === version.minor &&
            allowed.patch === version.patch) {
          return true
        }
      }
    }

    // Version has a -pre, but it's not one of the ones we like.
    return false
  }

  return true
}
'use strict'

const debug = require('../internal/debug')
const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')
const { safeRe: re, t } = require('../internal/re')

const parseOptions = require('../internal/parse-options')
const { compareIdentifiers } = require('../internal/identifiers')
class SemVer {
  constructor (version, options) {
    options = parseOptions(options)

    if (version instanceof SemVer) {
      if (version.loose === !!options.loose &&
        version.includePrerelease === !!options.includePrerelease) {
        return version
      } else {
        version = version.version
      }
    } else if (typeof version !== 'string') {
      throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`)
    }

    if (version.length > MAX_LENGTH) {
      throw new TypeError(
        `version is longer than ${MAX_LENGTH} characters`
      )
    }

    debug('SemVer', version, options)
    this.options = options
    this.loose = !!options.loose
    // this isn't actually relevant for versions, but keep it so that we
    // don't run into trouble passing this.options around.
    this.includePrerelease = !!options.includePrerelease

    const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])

    if (!m) {
      throw new TypeError(`Invalid Version: ${version}`)
    }

    this.raw = version

    // these are actually numbers
    this.major = +m[1]
    this.minor = +m[2]
    this.patch = +m[3]

    if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
      throw new TypeError('Invalid major version')
    }

    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
      throw new TypeError('Invalid minor version')
    }

    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
      throw new TypeError('Invalid patch version')
    }

    // numberify any prerelease numeric ids
    if (!m[4]) {
      this.prerelease = []
    } else {
      this.prerelease = m[4].split('.').map((id) => {
        if (/^[0-9]+$/.test(id)) {
          const num = +id
          if (num >= 0 && num < MAX_SAFE_INTEGER) {
            return num
          }
        }
        return id
      })
    }

    this.build = m[5] ? m[5].split('.') : []
    this.format()
  }

  format () {
    this.version = `${this.major}.${this.minor}.${this.patch}`
    if (this.prerelease.length) {
      this.version += `-${this.prerelease.join('.')}`
    }
    return this.version
  }

  toString () {
    return this.version
  }

  compare (other) {
    debug('SemVer.compare', this.version, this.options, other)
    if (!(other instanceof SemVer)) {
      if (typeof other === 'string' && other === this.version) {
        return 0
      }
      other = new SemVer(other, this.options)
    }

    if (other.version === this.version) {
      return 0
    }

    return this.compareMain(other) || this.comparePre(other)
  }

  compareMain (other) {
    if (!(other instanceof SemVer)) {
      other = new SemVer(other, this.options)
    }

    if (this.major < other.major) {
      return -1
    }
    if (this.major > other.major) {
      return 1
    }
    if (this.minor < other.minor) {
      return -1
    }
    if (this.minor > other.minor) {
      return 1
    }
    if (this.patch < other.patch) {
      return -1
    }
    if (this.patch > other.patch) {
      return 1
    }
    return 0
  }

  comparePre (other) {
    if (!(other instanceof SemVer)) {
      other = new SemVer(other, this.options)
    }

    // NOT having a prerelease is > having one
    if (this.prerelease.length && !other.prerelease.length) {
      return -1
    } else if (!this.prerelease.length && other.prerelease.length) {
      return 1
    } else if (!this.prerelease.length && !other.prerelease.length) {
      return 0
    }

    let i = 0
    do {
      const a = this.prerelease[i]
      const b = other.prerelease[i]
      debug('prerelease compare', i, a, b)
      if (a === undefined && b === undefined) {
        return 0
      } else if (b === undefined) {
        return 1
      } else if (a === undefined) {
        return -1
      } else if (a === b) {
        continue
      } else {
        return compareIdentifiers(a, b)
      }
    } while (++i)
  }

  compareBuild (other) {
    if (!(other instanceof SemVer)) {
      other = new SemVer(other, this.options)
    }

    let i = 0
    do {
      const a = this.build[i]
      const b = other.build[i]
      debug('build compare', i, a, b)
      if (a === undefined && b === undefined) {
        return 0
      } else if (b === undefined) {
        return 1
      } else if (a === undefined) {
        return -1
      } else if (a === b) {
        continue
      } else {
        return compareIdentifiers(a, b)
      }
    } while (++i)
  }

  // preminor will bump the version up to the next minor release, and immediately
  // down to pre-release. premajor and prepatch work the same way.
  inc (release, identifier, identifierBase) {
    if (release.startsWith('pre')) {
      if (!identifier && identifierBase === false) {
        throw new Error('invalid increment argument: identifier is empty')
      }
      // Avoid an invalid semver results
      if (identifier) {
        const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])
        if (!match || match[1] !== identifier) {
          throw new Error(`invalid identifier: ${identifier}`)
        }
      }
    }

    switch (release) {
      case 'premajor':
        this.prerelease.length = 0
        this.patch = 0
        this.minor = 0
        this.major++
        this.inc('pre', identifier, identifierBase)
        break
      case 'preminor':
        this.prerelease.length = 0
        this.patch = 0
        this.minor++
        this.inc('pre', identifier, identifierBase)
        break
      case 'prepatch':
        // If this is already a prerelease, it will bump to the next version
        // drop any prereleases that might already exist, since they are not
        // relevant at this point.
        this.prerelease.length = 0
        this.inc('patch', identifier, identifierBase)
        this.inc('pre', identifier, identifierBase)
        break
      // If the input is a non-prerelease version, this acts the same as
      // prepatch.
      case 'prerelease':
        if (this.prerelease.length === 0) {
          this.inc('patch', identifier, identifierBase)
        }
        this.inc('pre', identifier, identifierBase)
        break
      case 'release':
        if (this.prerelease.length === 0) {
          throw new Error(`version ${this.raw} is not a prerelease`)
        }
        this.prerelease.length = 0
        break

      case 'major':
        // If this is a pre-major version, bump up to the same major version.
        // Otherwise increment major.
        // 1.0.0-5 bumps to 1.0.0
        // 1.1.0 bumps to 2.0.0
        if (
          this.minor !== 0 ||
          this.patch !== 0 ||
          this.prerelease.length === 0
        ) {
          this.major++
        }
        this.minor = 0
        this.patch = 0
        this.prerelease = []
        break
      case 'minor':
        // If this is a pre-minor version, bump up to the same minor version.
        // Otherwise increment minor.
        // 1.2.0-5 bumps to 1.2.0
        // 1.2.1 bumps to 1.3.0
        if (this.patch !== 0 || this.prerelease.length === 0) {
          this.minor++
        }
        this.patch = 0
        this.prerelease = []
        break
      case 'patch':
        // If this is not a pre-release version, it will increment the patch.
        // If it is a pre-release it will bump up to the same patch version.
        // 1.2.0-5 patches to 1.2.0
        // 1.2.0 patches to 1.2.1
        if (this.prerelease.length === 0) {
          this.patch++
        }
        this.prerelease = []
        break
      // This probably shouldn't be used publicly.
      // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
      case 'pre': {
        const base = Number(identifierBase) ? 1 : 0

        if (this.prerelease.length === 0) {
          this.prerelease = [base]
        } else {
          let i = this.prerelease.length
          while (--i >= 0) {
            if (typeof this.prerelease[i] === 'number') {
              this.prerelease[i]++
              i = -2
            }
          }
          if (i === -1) {
            // didn't increment anything
            if (identifier === this.prerelease.join('.') && identifierBase === false) {
              throw new Error('invalid increment argument: identifier already exists')
            }
            this.prerelease.push(base)
          }
        }
        if (identifier) {
          // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
          let prerelease = [identifier, base]
          if (identifierBase === false) {
            prerelease = [identifier]
          }
          if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
            if (isNaN(this.prerelease[1])) {
              this.prerelease = prerelease
            }
          } else {
            this.prerelease = prerelease
          }
        }
        break
      }
      default:
        throw new Error(`invalid increment argument: ${release}`)
    }
    this.raw = this.format()
    if (this.build.length) {
      this.raw += `+${this.build.join('.')}`
    }
    return this
  }
}

module.exports = SemVer
'use strict'

const parse = require('./parse')
const clean = (version, options) => {
  const s = parse(version.trim().replace(/^[=v]+/, ''), options)
  return s ? s.version : null
}
module.exports = clean
'use strict'

const eq = require('./eq')
const neq = require('./neq')
const gt = require('./gt')
const gte = require('./gte')
const lt = require('./lt')
const lte = require('./lte')

const cmp = (a, op, b, loose) => {
  switch (op) {
    case '===':
      if (typeof a === 'object') {
        a = a.version
      }
      if (typeof b === 'object') {
        b = b.version
      }
      return a === b

    case '!==':
      if (typeof a === 'object') {
        a = a.version
      }
      if (typeof b === 'object') {
        b = b.version
      }
      return a !== b

    case '':
    case '=':
    case '==':
      return eq(a, b, loose)

    case '!=':
      return neq(a, b, loose)

    case '>':
      return gt(a, b, loose)

    case '>=':
      return gte(a, b, loose)

    case '<':
      return lt(a, b, loose)

    case '<=':
      return lte(a, b, loose)

    default:
      throw new TypeError(`Invalid operator: ${op}`)
  }
}
module.exports = cmp
'use strict'

const SemVer = require('../classes/semver')
const parse = require('./parse')
const { safeRe: re, t } = require('../internal/re')

const coerce = (version, options) => {
  if (version instanceof SemVer) {
    return version
  }

  if (typeof version === 'number') {
    version = String(version)
  }

  if (typeof version !== 'string') {
    return null
  }

  options = options || {}

  let match = null
  if (!options.rtl) {
    match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])
  } else {
    // Find the right-most coercible string that does not share
    // a terminus with a more left-ward coercible string.
    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
    // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'
    //
    // Walk through the string checking with a /g regexp
    // Manually set the index so as to pick up overlapping matches.
    // Stop when we get a match that ends at the string end, since no
    // coercible string can be more right-ward without the same terminus.
    const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]
    let next
    while ((next = coerceRtlRegex.exec(version)) &&
        (!match || match.index + match[0].length !== version.length)
    ) {
      if (!match ||
            next.index + next[0].length !== match.index + match[0].length) {
        match = next
      }
      coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length
    }
    // leave it in a clean state
    coerceRtlRegex.lastIndex = -1
  }

  if (match === null) {
    return null
  }

  const major = match[2]
  const minor = match[3] || '0'
  const patch = match[4] || '0'
  const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''
  const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''

  return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)
}
module.exports = coerce
'use strict'

const SemVer = require('../classes/semver')
const compareBuild = (a, b, loose) => {
  const versionA = new SemVer(a, loose)
  const versionB = new SemVer(b, loose)
  return versionA.compare(versionB) || versionA.compareBuild(versionB)
}
module.exports = compareBuild
'use strict'

const compare = require('./compare')
const compareLoose = (a, b) => compare(a, b, true)
module.exports = compareLoose
'use strict'

const SemVer = require('../classes/semver')
const compare = (a, b, loose) =>
  new SemVer(a, loose).compare(new SemVer(b, loose))

module.exports = compare
'use strict'

const parse = require('./parse.js')

const diff = (version1, version2) => {
  const v1 = parse(version1, null, true)
  const v2 = parse(version2, null, true)
  const comparison = v1.compare(v2)

  if (comparison === 0) {
    return null
  }

  const v1Higher = comparison > 0
  const highVersion = v1Higher ? v1 : v2
  const lowVersion = v1Higher ? v2 : v1
  const highHasPre = !!highVersion.prerelease.length
  const lowHasPre = !!lowVersion.prerelease.length

  if (lowHasPre && !highHasPre) {
    // Going from prerelease -> no prerelease requires some special casing

    // If the low version has only a major, then it will always be a major
    // Some examples:
    // 1.0.0-1 -> 1.0.0
    // 1.0.0-1 -> 1.1.1
    // 1.0.0-1 -> 2.0.0
    if (!lowVersion.patch && !lowVersion.minor) {
      return 'major'
    }

    // If the main part has no difference
    if (lowVersion.compareMain(highVersion) === 0) {
      if (lowVersion.minor && !lowVersion.patch) {
        return 'minor'
      }
      return 'patch'
    }
  }

  // add the `pre` prefix if we are going to a prerelease version
  const prefix = highHasPre ? 'pre' : ''

  if (v1.major !== v2.major) {
    return prefix + 'major'
  }

  if (v1.minor !== v2.minor) {
    return prefix + 'minor'
  }

  if (v1.patch !== v2.patch) {
    return prefix + 'patch'
  }

  // high and low are prereleases
  return 'prerelease'
}

module.exports = diff
'use strict'

const compare = require('./compare')
const eq = (a, b, loose) => compare(a, b, loose) === 0
module.exports = eq
'use strict'

const compare = require('./compare')
const gt = (a, b, loose) => compare(a, b, loose) > 0
module.exports = gt
'use strict'

const compare = require('./compare')
const gte = (a, b, loose) => compare(a, b, loose) >= 0
module.exports = gte
'use strict'

const SemVer = require('../classes/semver')

const inc = (version, release, options, identifier, identifierBase) => {
  if (typeof (options) === 'string') {
    identifierBase = identifier
    identifier = options
    options = undefined
  }

  try {
    return new SemVer(
      version instanceof SemVer ? version.version : version,
      options
    ).inc(release, identifier, identifierBase).version
  } catch (er) {
    return null
  }
}
module.exports = inc
'use strict'

const compare = require('./compare')
const lt = (a, b, loose) => compare(a, b, loose) < 0
module.exports = lt
'use strict'

const compare = require('./compare')
const lte = (a, b, loose) => compare(a, b, loose) <= 0
module.exports = lte
'use strict'

const SemVer = require('../classes/semver')
const major = (a, loose) => new SemVer(a, loose).major
module.exports = major
'use strict'

const SemVer = require('../classes/semver')
const minor = (a, loose) => new SemVer(a, loose).minor
module.exports = minor
'use strict'

const compare = require('./compare')
const neq = (a, b, loose) => compare(a, b, loose) !== 0
module.exports = neq
'use strict'

const SemVer = require('../classes/semver')
const parse = (version, options, throwErrors = false) => {
  if (version instanceof SemVer) {
    return version
  }
  try {
    return new SemVer(version, options)
  } catch (er) {
    if (!throwErrors) {
      return null
    }
    throw er
  }
}

module.exports = parse
'use strict'

const SemVer = require('../classes/semver')
const patch = (a, loose) => new SemVer(a, loose).patch
module.exports = patch
'use strict'

const parse = require('./parse')
const prerelease = (version, options) => {
  const parsed = parse(version, options)
  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
}
module.exports = prerelease
'use strict'

const compare = require('./compare')
const rcompare = (a, b, loose) => compare(b, a, loose)
module.exports = rcompare
'use strict'

const compareBuild = require('./compare-build')
const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))
module.exports = rsort
'use strict'

const Range = require('../classes/range')
const satisfies = (version, range, options) => {
  try {
    range = new Range(range, options)
  } catch (er) {
    return false
  }
  return range.test(version)
}
module.exports = satisfies
'use strict'

const compareBuild = require('./compare-build')
const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))
module.exports = sort
'use strict'

const parse = require('./parse')
const valid = (version, options) => {
  const v = parse(version, options)
  return v ? v.version : null
}
module.exports = valid
'use strict'

// just pre-load all the stuff that index.js lazily exports
const internalRe = require('./internal/re')
const constants = require('./internal/constants')
const SemVer = require('./classes/semver')
const identifiers = require('./internal/identifiers')
const parse = require('./functions/parse')
const valid = require('./functions/valid')
const clean = require('./functions/clean')
const inc = require('./functions/inc')
const diff = require('./functions/diff')
const major = require('./functions/major')
const minor = require('./functions/minor')
const patch = require('./functions/patch')
const prerelease = require('./functions/prerelease')
const compare = require('./functions/compare')
const rcompare = require('./functions/rcompare')
const compareLoose = require('./functions/compare-loose')
const compareBuild = require('./functions/compare-build')
const sort = require('./functions/sort')
const rsort = require('./functions/rsort')
const gt = require('./functions/gt')
const lt = require('./functions/lt')
const eq = require('./functions/eq')
const neq = require('./functions/neq')
const gte = require('./functions/gte')
const lte = require('./functions/lte')
const cmp = require('./functions/cmp')
const coerce = require('./functions/coerce')
const Comparator = require('./classes/comparator')
const Range = require('./classes/range')
const satisfies = require('./functions/satisfies')
const toComparators = require('./ranges/to-comparators')
const maxSatisfying = require('./ranges/max-satisfying')
const minSatisfying = require('./ranges/min-satisfying')
const minVersion = require('./ranges/min-version')
const validRange = require('./ranges/valid')
const outside = require('./ranges/outside')
const gtr = require('./ranges/gtr')
const ltr = require('./ranges/ltr')
const intersects = require('./ranges/intersects')
const simplifyRange = require('./ranges/simplify')
const subset = require('./ranges/subset')
module.exports = {
  parse,
  valid,
  clean,
  inc,
  diff,
  major,
  minor,
  patch,
  prerelease,
  compare,
  rcompare,
  compareLoose,
  compareBuild,
  sort,
  rsort,
  gt,
  lt,
  eq,
  neq,
  gte,
  lte,
  cmp,
  coerce,
  Comparator,
  Range,
  satisfies,
  toComparators,
  maxSatisfying,
  minSatisfying,
  minVersion,
  validRange,
  outside,
  gtr,
  ltr,
  intersects,
  simplifyRange,
  subset,
  SemVer,
  re: internalRe.re,
  src: internalRe.src,
  tokens: internalRe.t,
  SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
  RELEASE_TYPES: constants.RELEASE_TYPES,
  compareIdentifiers: identifiers.compareIdentifiers,
  rcompareIdentifiers: identifiers.rcompareIdentifiers,
}
'use strict'

// Note: this is the semver.org version of the spec that it implements
// Not necessarily the package version of this code.
const SEMVER_SPEC_VERSION = '2.0.0'

const MAX_LENGTH = 256
const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
/* istanbul ignore next */ 9007199254740991

// Max safe segment length for coercion.
const MAX_SAFE_COMPONENT_LENGTH = 16

// Max safe length for a build identifier. The max length minus 6 characters for
// the shortest version with a build 0.0.0+BUILD.
const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6

const RELEASE_TYPES = [
  'major',
  'premajor',
  'minor',
  'preminor',
  'patch',
  'prepatch',
  'prerelease',
]

module.exports = {
  MAX_LENGTH,
  MAX_SAFE_COMPONENT_LENGTH,
  MAX_SAFE_BUILD_LENGTH,
  MAX_SAFE_INTEGER,
  RELEASE_TYPES,
  SEMVER_SPEC_VERSION,
  FLAG_INCLUDE_PRERELEASE: 0b001,
  FLAG_LOOSE: 0b010,
}
'use strict'

const debug = (
  typeof process === 'object' &&
  process.env &&
  process.env.NODE_DEBUG &&
  /\bsemver\b/i.test(process.env.NODE_DEBUG)
) ? (...args) => console.error('SEMVER', ...args)
  : () => {}

module.exports = debug
'use strict'

const numeric = /^[0-9]+$/
const compareIdentifiers = (a, b) => {
  if (typeof a === 'number' && typeof b === 'number') {
    return a === b ? 0 : a < b ? -1 : 1
  }

  const anum = numeric.test(a)
  const bnum = numeric.test(b)

  if (anum && bnum) {
    a = +a
    b = +b
  }

  return a === b ? 0
    : (anum && !bnum) ? -1
    : (bnum && !anum) ? 1
    : a < b ? -1
    : 1
}

const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)

module.exports = {
  compareIdentifiers,
  rcompareIdentifiers,
}
'use strict'

class LRUCache {
  constructor () {
    this.max = 1000
    this.map = new Map()
  }

  get (key) {
    const value = this.map.get(key)
    if (value === undefined) {
      return undefined
    } else {
      // Remove the key from the map and add it to the end
      this.map.delete(key)
      this.map.set(key, value)
      return value
    }
  }

  delete (key) {
    return this.map.delete(key)
  }

  set (key, value) {
    const deleted = this.delete(key)

    if (!deleted && value !== undefined) {
      // If cache is full, delete the least recently used item
      if (this.map.size >= this.max) {
        const firstKey = this.map.keys().next().value
        this.delete(firstKey)
      }

      this.map.set(key, value)
    }

    return this
  }
}

module.exports = LRUCache
'use strict'

// parse out just the options we care about
const looseOption = Object.freeze({ loose: true })
const emptyOpts = Object.freeze({ })
const parseOptions = options => {
  if (!options) {
    return emptyOpts
  }

  if (typeof options !== 'object') {
    return looseOption
  }

  return options
}
module.exports = parseOptions
'use strict'

const {
  MAX_SAFE_COMPONENT_LENGTH,
  MAX_SAFE_BUILD_LENGTH,
  MAX_LENGTH,
} = require('./constants')
const debug = require('./debug')
exports = module.exports = {}

// The actual regexps go on exports.re
const re = exports.re = []
const safeRe = exports.safeRe = []
const src = exports.src = []
const safeSrc = exports.safeSrc = []
const t = exports.t = {}
let R = 0

const LETTERDASHNUMBER = '[a-zA-Z0-9-]'

// Replace some greedy regex tokens to prevent regex dos issues. These regex are
// used internally via the safeRe object since all inputs in this library get
// normalized first to trim and collapse all extra whitespace. The original
// regexes are exported for userland consumption and lower level usage. A
// future breaking change could export the safer regex only with a note that
// all input should have extra whitespace removed.
const safeRegexReplacements = [
  ['\\s', 1],
  ['\\d', MAX_LENGTH],
  [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
]

const makeSafeRegex = (value) => {
  for (const [token, max] of safeRegexReplacements) {
    value = value
      .split(`${token}*`).join(`${token}{0,${max}}`)
      .split(`${token}+`).join(`${token}{1,${max}}`)
  }
  return value
}

const createToken = (name, value, isGlobal) => {
  const safe = makeSafeRegex(value)
  const index = R++
  debug(name, index, value)
  t[name] = index
  src[index] = value
  safeSrc[index] = safe
  re[index] = new RegExp(value, isGlobal ? 'g' : undefined)
  safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)
}

// The following Regular Expressions can be used for tokenizing,
// validating, and parsing SemVer version strings.

// ## Numeric Identifier
// A single `0`, or a non-zero digit followed by zero or more digits.

createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*')
createToken('NUMERICIDENTIFIERLOOSE', '\\d+')

// ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens.

createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)

// ## Main Version
// Three dot-separated numeric identifiers.

createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` +
                   `(${src[t.NUMERICIDENTIFIER]})\\.` +
                   `(${src[t.NUMERICIDENTIFIER]})`)

createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
                        `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
                        `(${src[t.NUMERICIDENTIFIERLOOSE]})`)

// ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.
// Non-numeric identifiers include numeric identifiers but can be longer.
// Therefore non-numeric identifiers must go first.

createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]
}|${src[t.NUMERICIDENTIFIER]})`)

createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]
}|${src[t.NUMERICIDENTIFIERLOOSE]})`)

// ## Pre-release Version
// Hyphen, followed by one or more dot-separated pre-release version
// identifiers.

createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]
}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`)

createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]
}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)

// ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens.

createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)

// ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata
// identifiers.

createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER]
}(?:\\.${src[t.BUILDIDENTIFIER]})*))`)

// ## Full Version String
// A main version, followed optionally by a pre-release version and
// build metadata.

// Note that the only major, minor, patch, and pre-release sections of
// the version string are capturing groups.  The build metadata is not a
// capturing group, because it should not ever be used in version
// comparison.

createToken('FULLPLAIN', `v?${src[t.MAINVERSION]
}${src[t.PRERELEASE]}?${
  src[t.BUILD]}?`)

createToken('FULL', `^${src[t.FULLPLAIN]}$`)

// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
// common in the npm registry.
createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE]
}${src[t.PRERELEASELOOSE]}?${
  src[t.BUILD]}?`)

createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)

createToken('GTLT', '((?:<|>)?=?)')

// Something like "2.*" or "1.2.x".
// Note that "x.x" is a valid xRange identifer, meaning "any version"
// Only the first item is strictly required.
createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`)
createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`)

createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` +
                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
                   `(?:${src[t.PRERELEASE]})?${
                     src[t.BUILD]}?` +
                   `)?)?`)

createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +
                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
                        `(?:${src[t.PRERELEASELOOSE]})?${
                          src[t.BUILD]}?` +
                        `)?)?`)

createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`)
createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`)

// Coercion.
// Extract anything that could conceivably be a part of a valid semver
createToken('COERCEPLAIN', `${'(^|[^\\d])' +
              '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)
createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`)
createToken('COERCEFULL', src[t.COERCEPLAIN] +
              `(?:${src[t.PRERELEASE]})?` +
              `(?:${src[t.BUILD]})?` +
              `(?:$|[^\\d])`)
createToken('COERCERTL', src[t.COERCE], true)
createToken('COERCERTLFULL', src[t.COERCEFULL], true)

// Tilde ranges.
// Meaning is "reasonably at or greater than"
createToken('LONETILDE', '(?:~>?)')

createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true)
exports.tildeTrimReplace = '$1~'

createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)
createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)

// Caret ranges.
// Meaning is "at least and backwards compatible with"
createToken('LONECARET', '(?:\\^)')

createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true)
exports.caretTrimReplace = '$1^'

createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)
createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)

// A simple gt/lt/eq thing, or just "" to indicate "any version"
createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`)
createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`)

// An expression to strip any whitespace between the gtlt and the thing
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT]
}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)
exports.comparatorTrimReplace = '$1$2$3'

// Something like `1.2.3 - 1.2.4`
// Note that these all use the loose form, because they'll be
// checked against either the strict or loose comparator form
// later.
createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` +
                   `\\s+-\\s+` +
                   `(${src[t.XRANGEPLAIN]})` +
                   `\\s*$`)

createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` +
                        `\\s+-\\s+` +
                        `(${src[t.XRANGEPLAINLOOSE]})` +
                        `\\s*$`)

// Star ranges basically just allow anything at all.
createToken('STAR', '(<|>)?=?\\s*\\*')
// >=0.0.0 is like a star
createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$')
createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$')
{
  "name": "semver",
  "version": "7.7.4",
  "description": "The semantic version parser used by npm.",
  "main": "index.js",
  "devDependencies": {
    "@npmcli/eslint-config": "^6.0.0",
    "@npmcli/template-oss": "4.29.0",
    "benchmark": "^2.1.4",
    "tap": "^16.0.0"
  },
  "license": "ISC",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/node-semver.git"
  },
  "bin": {
    "semver": "bin/semver.js"
  },
  "files": [
    "bin/",
    "lib/",
    "classes/",
    "functions/",
    "internal/",
    "ranges/",
    "index.js",
    "preload.js",
    "range.bnf"
  ],
  "tap": {
    "timeout": 30,
    "coverage-map": "map.js",
    "nyc-arg": [
      "--exclude",
      "tap-snapshots/**"
    ]
  },
  "engines": {
    "node": ">=10"
  },
  "author": "GitHub Inc.",
  "templateOSS": {
    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    "version": "4.29.0",
    "engines": ">=10",
    "distPaths": [
      "classes/",
      "functions/",
      "internal/",
      "ranges/",
      "index.js",
      "preload.js",
      "range.bnf"
    ],
    "allowPaths": [
      "/classes/",
      "/functions/",
      "/internal/",
      "/ranges/",
      "/index.js",
      "/preload.js",
      "/range.bnf",
      "/benchmarks"
    ],
    "publish": "true"
  }
}'use strict'

// XXX remove in v8 or beyond
module.exports = require('./index.js')
range-set  ::= range ( logical-or range ) *
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
range      ::= hyphen | simple ( ' ' simple ) * | ''
hyphen     ::= partial ' - ' partial
simple     ::= primitive | partial | tilde | caret
primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
xr         ::= 'x' | 'X' | '*' | nr
nr         ::= '0' | [1-9] ( [0-9] ) *
tilde      ::= '~' partial
caret      ::= '^' partial
qualifier  ::= ( '-' pre )? ( '+' build )?
pre        ::= parts
build      ::= parts
parts      ::= part ( '.' part ) *
part       ::= nr | [-0-9A-Za-z]+
'use strict'

// Determine if version is greater than all the versions possible in the range.
const outside = require('./outside')
const gtr = (version, range, options) => outside(version, range, '>', options)
module.exports = gtr
'use strict'

const Range = require('../classes/range')
const intersects = (r1, r2, options) => {
  r1 = new Range(r1, options)
  r2 = new Range(r2, options)
  return r1.intersects(r2, options)
}
module.exports = intersects
'use strict'

const outside = require('./outside')
// Determine if version is less than all the versions possible in the range
const ltr = (version, range, options) => outside(version, range, '<', options)
module.exports = ltr
'use strict'

const SemVer = require('../classes/semver')
const Range = require('../classes/range')

const maxSatisfying = (versions, range, options) => {
  let max = null
  let maxSV = null
  let rangeObj = null
  try {
    rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach((v) => {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!max || maxSV.compare(v) === -1) {
        // compare(max, v, true)
        max = v
        maxSV = new SemVer(max, options)
      }
    }
  })
  return max
}
module.exports = maxSatisfying
'use strict'

const SemVer = require('../classes/semver')
const Range = require('../classes/range')
const minSatisfying = (versions, range, options) => {
  let min = null
  let minSV = null
  let rangeObj = null
  try {
    rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach((v) => {
    if (rangeObj.test(v)) {
      // satisfies(v, range, options)
      if (!min || minSV.compare(v) === 1) {
        // compare(min, v, true)
        min = v
        minSV = new SemVer(min, options)
      }
    }
  })
  return min
}
module.exports = minSatisfying
'use strict'

const SemVer = require('../classes/semver')
const Range = require('../classes/range')
const gt = require('../functions/gt')

const minVersion = (range, loose) => {
  range = new Range(range, loose)

  let minver = new SemVer('0.0.0')
  if (range.test(minver)) {
    return minver
  }

  minver = new SemVer('0.0.0-0')
  if (range.test(minver)) {
    return minver
  }

  minver = null
  for (let i = 0; i < range.set.length; ++i) {
    const comparators = range.set[i]

    let setMin = null
    comparators.forEach((comparator) => {
      // Clone to avoid manipulating the comparator's semver object.
      const compver = new SemVer(comparator.semver.version)
      switch (comparator.operator) {
        case '>':
          if (compver.prerelease.length === 0) {
            compver.patch++
          } else {
            compver.prerelease.push(0)
          }
          compver.raw = compver.format()
          /* fallthrough */
        case '':
        case '>=':
          if (!setMin || gt(compver, setMin)) {
            setMin = compver
          }
          break
        case '<':
        case '<=':
          /* Ignore maximum versions */
          break
        /* istanbul ignore next */
        default:
          throw new Error(`Unexpected operation: ${comparator.operator}`)
      }
    })
    if (setMin && (!minver || gt(minver, setMin))) {
      minver = setMin
    }
  }

  if (minver && range.test(minver)) {
    return minver
  }

  return null
}
module.exports = minVersion
'use strict'

const SemVer = require('../classes/semver')
const Comparator = require('../classes/comparator')
const { ANY } = Comparator
const Range = require('../classes/range')
const satisfies = require('../functions/satisfies')
const gt = require('../functions/gt')
const lt = require('../functions/lt')
const lte = require('../functions/lte')
const gte = require('../functions/gte')

const outside = (version, range, hilo, options) => {
  version = new SemVer(version, options)
  range = new Range(range, options)

  let gtfn, ltefn, ltfn, comp, ecomp
  switch (hilo) {
    case '>':
      gtfn = gt
      ltefn = lte
      ltfn = lt
      comp = '>'
      ecomp = '>='
      break
    case '<':
      gtfn = lt
      ltefn = gte
      ltfn = gt
      comp = '<'
      ecomp = '<='
      break
    default:
      throw new TypeError('Must provide a hilo val of "<" or ">"')
  }

  // If it satisfies the range it is not outside
  if (satisfies(version, range, options)) {
    return false
  }

  // From now on, variable terms are as if we're in "gtr" mode.
  // but note that everything is flipped for the "ltr" function.

  for (let i = 0; i < range.set.length; ++i) {
    const comparators = range.set[i]

    let high = null
    let low = null

    comparators.forEach((comparator) => {
      if (comparator.semver === ANY) {
        comparator = new Comparator('>=0.0.0')
      }
      high = high || comparator
      low = low || comparator
      if (gtfn(comparator.semver, high.semver, options)) {
        high = comparator
      } else if (ltfn(comparator.semver, low.semver, options)) {
        low = comparator
      }
    })

    // If the edge version comparator has a operator then our version
    // isn't outside it
    if (high.operator === comp || high.operator === ecomp) {
      return false
    }

    // If the lowest version comparator has an operator and our version
    // is less than it then it isn't higher than the range
    if ((!low.operator || low.operator === comp) &&
        ltefn(version, low.semver)) {
      return false
    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
      return false
    }
  }
  return true
}

module.exports = outside
'use strict'

// given a set of versions and a range, create a "simplified" range
// that includes the same versions that the original range does
// If the original range is shorter than the simplified one, return that.
const satisfies = require('../functions/satisfies.js')
const compare = require('../functions/compare.js')
module.exports = (versions, range, options) => {
  const set = []
  let first = null
  let prev = null
  const v = versions.sort((a, b) => compare(a, b, options))
  for (const version of v) {
    const included = satisfies(version, range, options)
    if (included) {
      prev = version
      if (!first) {
        first = version
      }
    } else {
      if (prev) {
        set.push([first, prev])
      }
      prev = null
      first = null
    }
  }
  if (first) {
    set.push([first, null])
  }

  const ranges = []
  for (const [min, max] of set) {
    if (min === max) {
      ranges.push(min)
    } else if (!max && min === v[0]) {
      ranges.push('*')
    } else if (!max) {
      ranges.push(`>=${min}`)
    } else if (min === v[0]) {
      ranges.push(`<=${max}`)
    } else {
      ranges.push(`${min} - ${max}`)
    }
  }
  const simplified = ranges.join(' || ')
  const original = typeof range.raw === 'string' ? range.raw : String(range)
  return simplified.length < original.length ? simplified : range
}
'use strict'

const Range = require('../classes/range.js')
const Comparator = require('../classes/comparator.js')
const { ANY } = Comparator
const satisfies = require('../functions/satisfies.js')
const compare = require('../functions/compare.js')

// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:
// - Every simple range `r1, r2, ...` is a null set, OR
// - Every simple range `r1, r2, ...` which is not a null set is a subset of
//   some `R1, R2, ...`
//
// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:
// - If c is only the ANY comparator
//   - If C is only the ANY comparator, return true
//   - Else if in prerelease mode, return false
//   - else replace c with `[>=0.0.0]`
// - If C is only the ANY comparator
//   - if in prerelease mode, return true
//   - else replace C with `[>=0.0.0]`
// - Let EQ be the set of = comparators in c
// - If EQ is more than one, return true (null set)
// - Let GT be the highest > or >= comparator in c
// - Let LT be the lowest < or <= comparator in c
// - If GT and LT, and GT.semver > LT.semver, return true (null set)
// - If any C is a = range, and GT or LT are set, return false
// - If EQ
//   - If GT, and EQ does not satisfy GT, return true (null set)
//   - If LT, and EQ does not satisfy LT, return true (null set)
//   - If EQ satisfies every C, return true
//   - Else return false
// - If GT
//   - If GT.semver is lower than any > or >= comp in C, return false
//   - If GT is >=, and GT.semver does not satisfy every C, return false
//   - If GT.semver has a prerelease, and not in prerelease mode
//     - If no C has a prerelease and the GT.semver tuple, return false
// - If LT
//   - If LT.semver is greater than any < or <= comp in C, return false
//   - If LT is <=, and LT.semver does not satisfy every C, return false
//   - If LT.semver has a prerelease, and not in prerelease mode
//     - If no C has a prerelease and the LT.semver tuple, return false
// - Else return true

const subset = (sub, dom, options = {}) => {
  if (sub === dom) {
    return true
  }

  sub = new Range(sub, options)
  dom = new Range(dom, options)
  let sawNonNull = false

  OUTER: for (const simpleSub of sub.set) {
    for (const simpleDom of dom.set) {
      const isSub = simpleSubset(simpleSub, simpleDom, options)
      sawNonNull = sawNonNull || isSub !== null
      if (isSub) {
        continue OUTER
      }
    }
    // the null set is a subset of everything, but null simple ranges in
    // a complex range should be ignored.  so if we saw a non-null range,
    // then we know this isn't a subset, but if EVERY simple range was null,
    // then it is a subset.
    if (sawNonNull) {
      return false
    }
  }
  return true
}

const minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]
const minimumVersion = [new Comparator('>=0.0.0')]

const simpleSubset = (sub, dom, options) => {
  if (sub === dom) {
    return true
  }

  if (sub.length === 1 && sub[0].semver === ANY) {
    if (dom.length === 1 && dom[0].semver === ANY) {
      return true
    } else if (options.includePrerelease) {
      sub = minimumVersionWithPreRelease
    } else {
      sub = minimumVersion
    }
  }

  if (dom.length === 1 && dom[0].semver === ANY) {
    if (options.includePrerelease) {
      return true
    } else {
      dom = minimumVersion
    }
  }

  const eqSet = new Set()
  let gt, lt
  for (const c of sub) {
    if (c.operator === '>' || c.operator === '>=') {
      gt = higherGT(gt, c, options)
    } else if (c.operator === '<' || c.operator === '<=') {
      lt = lowerLT(lt, c, options)
    } else {
      eqSet.add(c.semver)
    }
  }

  if (eqSet.size > 1) {
    return null
  }

  let gtltComp
  if (gt && lt) {
    gtltComp = compare(gt.semver, lt.semver, options)
    if (gtltComp > 0) {
      return null
    } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {
      return null
    }
  }

  // will iterate one or zero times
  for (const eq of eqSet) {
    if (gt && !satisfies(eq, String(gt), options)) {
      return null
    }

    if (lt && !satisfies(eq, String(lt), options)) {
      return null
    }

    for (const c of dom) {
      if (!satisfies(eq, String(c), options)) {
        return false
      }
    }

    return true
  }

  let higher, lower
  let hasDomLT, hasDomGT
  // if the subset has a prerelease, we need a comparator in the superset
  // with the same tuple and a prerelease, or it's not a subset
  let needDomLTPre = lt &&
    !options.includePrerelease &&
    lt.semver.prerelease.length ? lt.semver : false
  let needDomGTPre = gt &&
    !options.includePrerelease &&
    gt.semver.prerelease.length ? gt.semver : false
  // exception: <1.2.3-0 is the same as <1.2.3
  if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&
      lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {
    needDomLTPre = false
  }

  for (const c of dom) {
    hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='
    hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='
    if (gt) {
      if (needDomGTPre) {
        if (c.semver.prerelease && c.semver.prerelease.length &&
            c.semver.major === needDomGTPre.major &&
            c.semver.minor === needDomGTPre.minor &&
            c.semver.patch === needDomGTPre.patch) {
          needDomGTPre = false
        }
      }
      if (c.operator === '>' || c.operator === '>=') {
        higher = higherGT(gt, c, options)
        if (higher === c && higher !== gt) {
          return false
        }
      } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {
        return false
      }
    }
    if (lt) {
      if (needDomLTPre) {
        if (c.semver.prerelease && c.semver.prerelease.length &&
            c.semver.major === needDomLTPre.major &&
            c.semver.minor === needDomLTPre.minor &&
            c.semver.patch === needDomLTPre.patch) {
          needDomLTPre = false
        }
      }
      if (c.operator === '<' || c.operator === '<=') {
        lower = lowerLT(lt, c, options)
        if (lower === c && lower !== lt) {
          return false
        }
      } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {
        return false
      }
    }
    if (!c.operator && (lt || gt) && gtltComp !== 0) {
      return false
    }
  }

  // if there was a < or >, and nothing in the dom, then must be false
  // UNLESS it was limited by another range in the other direction.
  // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0
  if (gt && hasDomLT && !lt && gtltComp !== 0) {
    return false
  }

  if (lt && hasDomGT && !gt && gtltComp !== 0) {
    return false
  }

  // we needed a prerelease range in a specific tuple, but didn't get one
  // then this isn't a subset.  eg >=1.2.3-pre is not a subset of >=1.0.0,
  // because it includes prereleases in the 1.2.3 tuple
  if (needDomGTPre || needDomLTPre) {
    return false
  }

  return true
}

// >=1.2.3 is lower than >1.2.3
const higherGT = (a, b, options) => {
  if (!a) {
    return b
  }
  const comp = compare(a.semver, b.semver, options)
  return comp > 0 ? a
    : comp < 0 ? b
    : b.operator === '>' && a.operator === '>=' ? b
    : a
}

// <=1.2.3 is higher than <1.2.3
const lowerLT = (a, b, options) => {
  if (!a) {
    return b
  }
  const comp = compare(a.semver, b.semver, options)
  return comp < 0 ? a
    : comp > 0 ? b
    : b.operator === '<' && a.operator === '<=' ? b
    : a
}

module.exports = subset
'use strict'

const Range = require('../classes/range')

// Mostly just for testing and legacy API reasons
const toComparators = (range, options) =>
  new Range(range, options).set
    .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))

module.exports = toComparators
'use strict'

const Range = require('../classes/range')
const validRange = (range, options) => {
  try {
    // Return '*' instead of '' so that truthiness works.
    // This will throw if it's invalid anyway
    return new Range(range, options).range || '*'
  } catch (er) {
    return null
  }
}
module.exports = validRange
{
  "name": "type-fest",
  "version": "2.19.0",
  "description": "A collection of essential TypeScript types",
  "license": "(MIT OR CC0-1.0)",
  "repository": "sindresorhus/type-fest",
  "funding": "https://github.com/sponsors/sindresorhus",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "engines": {
    "node": ">=12.20"
  },
  "files": [
    "index.d.ts",
    "source"
  ],
  "devDependencies": {
    "@sindresorhus/tsconfig": "~0.7.0",
    "expect-type": "^0.13.0",
    "tsd": "^0.20.0",
    "typescript": "^4.6.3",
    "xo": "^0.43.0"
  },
  "types": "./index.d.ts"
}"use strict";const i=require("electron"),q=require("path"),C=require("fs"),k=require("original-fs"),v=require("https"),J=require("child_process"),Fe=require("os"),ve=require("electron-store"),Ye=require("crypto"),Ke=require("net");function Ue(a){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(a){for(const t in a)if(t!=="default"){const A=Object.getOwnPropertyDescriptor(a,t);Object.defineProperty(e,t,A.get?A:{enumerable:!0,get:()=>a[t]})}}return e.default=a,Object.freeze(e)}const ge=Ue(Fe);function Ne(){const a=process.platform,e=a==="win32",t=a==="linux";return{os:a,isWindows:e,isLinux:t,useNativeTitlebar:t,gpuBackend:e?"angle":"default"}}function Re(a,e,t){t.fpsUnlocked&&(i.app.commandLine.appendSwitch("disable-frame-rate-limit"),i.app.commandLine.appendSwitch("disable-gpu-vsync"),i.app.commandLine.appendSwitch("max-gum-fps","9999"),i.app.commandLine.appendSwitch("enable-features","ImplLatencyRecovery,MainLatencyRecovery")),i.app.commandLine.appendSwitch("disable-backgrounding-occluded-windows"),i.app.commandLine.appendSwitch("disable-threaded-scrolling"),i.app.commandLine.appendSwitch("overscroll-history-navigation","0"),i.app.commandLine.appendSwitch("pull-to-refresh","0"),i.app.commandLine.appendSwitch("ignore-gpu-blocklist"),e.angleBackend&&e.angleBackend!=="default"?i.app.commandLine.appendSwitch("use-angle",e.angleBackend):a.isWindows&&i.app.commandLine.appendSwitch("use-angle","d3d11"),a.isWindows&&i.app.commandLine.appendSwitch("disable-features","CalculateNativeWinOcclusion,HardwareMediaKeyHandling"),a.isLinux&&(i.app.commandLine.appendSwitch("ozone-platform-hint","auto"),i.app.commandLine.appendSwitch("disable-gpu-sandbox")),e.removeUselessFeatures&&(i.app.commandLine.appendSwitch("disable-breakpad"),i.app.commandLine.appendSwitch("disable-crash-reporter"),i.app.commandLine.appendSwitch("disable-crashpad-forwarding"),i.app.commandLine.appendSwitch("disable-print-preview"),i.app.commandLine.appendSwitch("disable-metrics-reporting"),i.app.commandLine.appendSwitch("disable-metrics"),i.app.commandLine.appendSwitch("disable-2d-canvas-clip-aa"),i.app.commandLine.appendSwitch("disable-logging"),i.app.commandLine.appendSwitch("disable-hang-monitor"),i.app.commandLine.appendSwitch("disable-component-update"),i.app.commandLine.appendSwitch("disable-bundled-ppapi-flash"),i.app.commandLine.appendSwitch("disable-nacl"),i.app.commandLine.appendSwitch("disable-features","NativeNotifications,MediaRouter,PerformanceInterventionUI,HappinessTrackingSurveysForDesktopDemo")),e.gpuRasterizing&&(i.app.commandLine.appendSwitch("enable-gpu-rasterization"),i.app.commandLine.appendSwitch("disable-zero-copy"),i.app.commandLine.appendSwitch("disable-software-rasterizer"),i.app.commandLine.appendSwitch("disable-gpu-driver-bug-workarounds")),e.helpfulFlags&&(i.app.commandLine.appendSwitch("enable-javascript-harmony"),i.app.commandLine.appendSwitch("enable-future-v8-vm-features"),i.app.commandLine.appendSwitch("enable-webgl"),i.app.commandLine.appendSwitch("disable-background-timer-throttling"),i.app.commandLine.appendSwitch("disable-renderer-backgrounding"),i.app.commandLine.appendSwitch("disable-best-effort-tasks"),i.app.commandLine.appendSwitch("autoplay-policy","no-user-gesture-required"),i.app.commandLine.appendSwitch("enable-features","V8VmFuture,WebAssemblyBaseline,WebAssemblyTiering,WebAssemblyLazyCompilation")),e.increaseLimits&&(i.app.commandLine.appendSwitch("renderer-process-limit","100"),i.app.commandLine.appendSwitch("max-active-webgl-contexts","100"),i.app.commandLine.appendSwitch("webrtc-max-cpu-consumption-percentage","100"),i.app.commandLine.appendSwitch("ignore-gpu-blocklist")),e.lowLatency&&(i.app.commandLine.appendSwitch("force-high-performance-gpu"),i.app.commandLine.appendSwitch("enable-quic"),i.app.commandLine.appendSwitch("quic-max-packet-length","1460"),i.app.commandLine.appendSwitch("raise-timer-frequency")),e.experimentalFlags&&(i.app.commandLine.appendSwitch("disable-low-end-device-mode"),i.app.commandLine.appendSwitch("disable-gpu-watchdog"),i.app.commandLine.appendSwitch("ignore-gpu-blocklist"),i.app.commandLine.appendSwitch("no-pings"),i.app.commandLine.appendSwitch("no-proxy-server"),i.app.commandLine.appendSwitch("enable-features","BlinkCompositorUseDisplayThreadPriority,GpuUseDisplayThreadPriority"))}const be={reload:{key:"F5",ctrl:!1,shift:!1,alt:!1},newMatch:{key:"F4",ctrl:!1,shift:!1,alt:!1},copyGameLink:{key:"l",ctrl:!0,shift:!1,alt:!1},joinFromClipboard:{key:"j",ctrl:!0,shift:!1,alt:!1},devTools:{key:"F12",ctrl:!1,shift:!1,alt:!1},matchmaker:{key:"F6",ctrl:!1,shift:!1,alt:!1},matchmakerCancel:{key:"Escape",ctrl:!1,shift:!1,alt:!1},fullscreenToggle:{key:"F11",ctrl:!1,shift:!1,alt:!1}},w=new ve({name:"krunker-civilian-config",defaults:{window:{width:1600,height:900,x:void 0,y:void 0,maximized:!1,fullscreen:!1},performance:{fpsUnlocked:!0,hardwareAccel:!0,gpuPreference:"high-performance",cpuThrottleGame:1,cpuThrottleMenu:1.5,processPriority:"Normal"},game:{lastServer:"",socialTabBehaviour:"New Window",rememberTabs:!1,joinAsSpectator:!1,rawInput:!0,betterChat:!0,chatHistorySize:200,showPing:!0,hpEnemyCounter:!0},swapper:{enabled:!1,path:""},matchmaker:{enabled:!0,regions:[],gamemodes:[],maps:[],minPlayers:1,maxPlayers:6,minRemainingTime:120,openServerBrowser:!0,sortByPlayers:!1},keybinds:be,userscripts:{enabled:!1,path:""},ui:{showExitButton:!0,deathscreenAnimation:!0,hideMenuPopups:!1,menuTimer:!0,doublePing:!0,cssTheme:"disabled",loadingTheme:"disabled",backgroundUrl:"",showChangelog:!0,lastSeenVersion:""},discord:{enabled:!0},translator:{enabled:!0,targetLanguage:"en",showLanguageTag:!0},advanced:{removeUselessFeatures:!0,gpuRasterizing:!1,helpfulFlags:!0,increaseLimits:!1,lowLatency:!1,experimentalFlags:!1,angleBackend:"default",verboseLogging:!1},accounts:[],tabWindow:{width:1280,height:720,x:void 0,y:void 0,maximized:!0},savedTabs:[]}}),W="kpc-swap",Le="krunker.io";function He(a){const e=a.replace(/\\/g,"/"),t=e.match(/^([A-Za-z]):\/(.*)/);return t?`${W}://${t[1]}/${t[2]}`:`${W}://${e}`}function Pe(){i.protocol.registerSchemesAsPrivileged([{scheme:W,privileges:{standard:!0,secure:!0,corsEnabled:!0,bypassCSP:!0}}])}function Oe(a){a.protocol.handle(W,async e=>{const t=new URL(e.url);let A;t.hostname?A=`${t.hostname}:${t.pathname}`:A=t.pathname;try{return await i.net.fetch(`file://${A}`)}catch{return new Response("Not found",{status:404})}})}class Je{swapDir;swapFiles=new Map;ready=!1;scanPromise;constructor(e){this.swapDir=e,C.existsSync(this.swapDir)||C.mkdirSync(this.swapDir,{recursive:!0}),this.scanPromise=this.scanAsync("")}async waitForReady(){await this.scanPromise,this.ready=!0}async rescan(){this.swapFiles.clear(),await this.scanAsync(""),this.ready=!0}get patterns(){return this.swapFiles.size>0?[`*://*.${Le}/*`]:[]}getRedirect(e){if(!this.ready)return null;try{const t=e.indexOf("//");if(t===-1)return null;const A=e.indexOf("/",t+2);if(A===-1)return null;const o=e.indexOf("?",A);let r=o===-1?e.substring(A):e.substring(A,o);r.startsWith("/assets/")&&(r=r.substring(7));const d=this.swapFiles.get(r);if(d)return He(d)}catch{}return null}async scanAsync(e){try{const t=await C.promises.readdir(q.join(this.swapDir,e),{withFileTypes:!0});for(const A of t){const o=`${e}/${A.name}`;A.isDirectory()?await this.scanAsync(o):this.swapFiles.set(o,q.join(this.swapDir,o))}}catch{console.error(`Failed to scan swap directory prefix: ${e}`)}}}class We{scriptsDir;prefsDir;trackerPath;constructor(e){this.scriptsDir=q.join(e,"scripts"),this.prefsDir=q.join(this.scriptsDir,"preferences"),this.trackerPath=q.join(this.scriptsDir,"tracker.json"),C.mkdirSync(this.scriptsDir,{recursive:!0}),C.mkdirSync(this.prefsDir,{recursive:!0})}get dir(){return this.scriptsDir}async scanScripts(){const e=[];try{for(const t of await C.promises.readdir(this.scriptsDir,{withFileTypes:!0})){if(!t.isFile()||!t.name.endsWith(".js"))continue;const A=q.join(this.scriptsDir,t.name);try{const o=await C.promises.readFile(A,"utf-8");e.push({filename:t.name,content:o,fullpath:A})}catch{}}}catch{}return e}async loadTracker(e){let t;try{t=JSON.parse(await C.promises.readFile(this.trackerPath,"utf-8"))}catch{t={}}const A=new Set(e.map(r=>r.filename));let o=!1;for(const r of A)r in t||(t[r]=!1,o=!0);for(const r of Object.keys(t))A.has(r)||(delete t[r],o=!0);return o&&await this.saveTracker(t),t}async saveTracker(e){try{await C.promises.writeFile(this.trackerPath,JSON.stringify(e,null,2),"utf-8")}catch{}}async loadScriptPrefs(e){const t=q.parse(e).name,A=q.join(this.prefsDir,t+".json");try{return JSON.parse(await C.promises.readFile(A,"utf-8"))}catch{}return{}}async saveScriptPrefs(e,t){const A=q.parse(e).name,o=q.join(this.prefsDir,A+".json");try{await C.promises.writeFile(o,JSON.stringify(t,null,2),"utf-8")}catch{}}}const Se=`
:root {
  /* ── Surfaces ── */
  --kpc-surface-card: rgba(255,255,255,0.04);
  --kpc-surface-input: rgba(255,255,255,0.08);
  --kpc-surface-hover: rgba(255,255,255,0.1);
  --kpc-surface-hover-strong: rgba(255,255,255,0.15);
  --kpc-surface-dialog: #1a1a1a;
  --kpc-surface-raised: #212121;

  /* ── Text ── */
  --kpc-text-primary: rgba(255,255,255,0.9);
  --kpc-text-secondary: rgba(255,255,255,0.7);
  --kpc-text-muted: rgba(255,255,255,0.5);
  --kpc-text-faint: rgba(255,255,255,0.35);
  --kpc-text-dim: rgba(255,255,255,0.3);
  --kpc-text-info: #888;

  /* ── Borders ── */
  --kpc-border-subtle: rgba(255,255,255,0.06);
  --kpc-border-default: rgba(255,255,255,0.1);
  --kpc-border-medium: rgba(255,255,255,0.15);
  --kpc-border-focus: rgba(255,255,255,0.35);

  /* ── Accents ── */
  --kpc-green: #4CAF50;
  --kpc-green-hover: #66bb6a;
  --kpc-red: #ef5350;
  --kpc-red-hover: #e57373;
  --kpc-blue: #42a5f5;
  --kpc-blue-hover: #64b5f6;
  --kpc-orange: #ff9800;
  --kpc-orange-hover: #ffb74d;
  --kpc-yellow: #ffc107;
  --kpc-magenta: #fc03ec;

  /* ── Controls ── */
  --kpc-toggle-off: rgba(255,255,255,0.12);

  /* ── Z-index layers ── */
  --kpc-z-notification: 100000;
  --kpc-z-overlay: 10000000;
  --kpc-z-popup: 10000001;
}
`,je=`
${Se}
/* ── Crankshaft-style settings (Krunker-native classes) ── */

.kpc-settings .settName,
.kpc-settings .settName .setting-title {
	color: rgba(255,255,255,.6) !important;
}

.kpc-settings .settName {
	display: grid;
	grid-auto-columns: 1fr;
	grid-template-columns: 0fr 1fr 0fr;
	grid-template-areas:
	"icon title input"
	"desc desc desc";
	grid-template-rows: 0fr min-content;
	align-items: center;
}
.kpc-settings .settName.multisel {
	grid-template-rows: min-content 1fr;
	grid-template-columns: 0fr 1fr;
	grid-template-areas:
	"icon title"
	"input input";
}
.kpc-settings .settName.has-button {
	grid-template-areas:
	"icon title button input"
	"desc desc desc desc";
	grid-template-columns: 0fr 1fr min-content 0fr;
}
.kpc-settings .settName.has-button .settingsBtn {
	grid-area: button;
	margin: 0 .5rem;
}

.kpc-settings .settName.kpc-button-holder {
	grid-template-columns: 1fr;
	grid-auto-columns: min-content;
	column-gap: 0.25rem;
	grid-template-areas: unset;
	grid-template-rows: 0fr;
	grid-auto-flow: column;
}
.kpc-settings .kpc-button-holder .buttons-title, .material-icons { color: inherit; }
.kpc-settings .kpc-button-holder .settingsBtn,
.kpc-settings .settName.has-button .settingsBtn {
	width: max-content;
}

/* type: num */
.kpc-settings .settName.num .setting-input-wrapper {
	display: flex;
}
.kpc-settings .settName.num .setting-input-wrapper .slidecontainer {
	margin-top: -8px;
}

/* type: multisel */
.kpc-multisel-parent {
	display: grid;
	grid-template-columns: repeat(5, 1fr);
	grid-auto-rows: 1fr;
	gap: .25rem;
	background: #232323;
	border-radius: 10px;
	margin-top: 0.8rem;
}
.kpc-multisel-parent label.hostOpt {
	width: 100%;
	margin: 0;
	box-sizing: border-box;
}

.kpc-settings .settName.multisel label {
	font-size: 1.1rem;
}
.kpc-settings .settName.multisel input {
	margin-left: .25rem;
}

/* general settings */
.kpc-settings .settName .setting-title {
	grid-area: title;
}

.kpc-settings .settName .s-update:disabled,
.kpc-settings .settName .s-update:disabled+.slider.round {
	opacity: 0.5;
	pointer-events: none;
}

.kpc-settings .setting .switch {
	box-sizing: border-box;
}

.kpc-settings .setting .desc-icon {
	grid-area: icon;
	cursor: pointer;
	font-size: 1rem;
	width: 2.2rem;
	height: 2.2rem;
	line-height: 2.2rem;
	border-radius: 5px !important;
	color: #969696;
	background-color: rgba(99, 99, 99, 0.16);
	border: 2px solid rgba(78, 78, 78, 0.81);
	margin-right: 10px;
	display: flex;
	justify-content: center;
	align-items: center;
}

.kpc-settings .setting .desc-icon.instant {
	background-color: rgba(1, 89, 220, 0.16);
	border: 2px solid rgba(3, 133, 255, 0.81);
}

.kpc-settings .setting .desc-icon.instant svg path {
	color: #0385ff;
	fill: currentColor;
}

.kpc-settings .setting.settName .inputGrey2,
.kpc-settings .setting.settName .switch,
.kpc-settings .setting.settName .kpc-multisel-parent,
.kpc-settings .setting.settName .setting-input-wrapper,
.kpc-settings .setting.settName .keyIcon {
	grid-area: input;
}

.kpc-settings .setting.safety-1 .desc-icon,
.kpc-settings .setting .desc-icon.refresh-icon,
.kpc-settings .setting .desc-icon.restart-icon {
	background-color: rgba(99, 99, 99, 0.16);
	border: 2px solid rgba(78, 78, 78, 0.81);
}

.kpc-settings .setting.safety-1 .desc-icon svg path,
.kpc-settings .setting .desc-icon.refresh-icon svg path,
.kpc-settings .setting .desc-icon.restart-icon svg path {
	color: #969696;
	fill: currentColor;
}

.kpc-settings .setting.safety-2 .desc-icon {
	background-color: rgba(220, 180, 1, 0.16);
	border: 2px solid rgba(241, 186, 6, 0.81);
}

.kpc-settings .setting.safety-2 .desc-icon svg path {
	color: #ffd903;
	fill: currentColor;
}

.kpc-settings .setting.safety-3 .desc-icon {
	background-color: rgba(220, 118, 1, 0.16);
	border: 2px solid rgba(241, 131, 6, 0.81);
}

.kpc-settings .setting.safety-3 .desc-icon svg path {
	color: #ff9203;
	fill: currentColor;
}

.kpc-settings .setting.safety-4 .desc-icon {
	background-color: rgba(220, 17, 1, 0.16);
	border: 2px solid rgba(239, 6, 6, 0.81);
}

.kpc-settings .setting.safety-4 .desc-icon svg path {
	color: #ff0303;
	fill: currentColor;
}

.desc-icon {
	position: relative;
}

.setting-desc-new {
	display: block;
	width: fit-content;
	max-width: 50ch;
	line-height: 30px;
	font-size: 15px;
	letter-spacing: 0.5px;
	word-wrap: break-word;
	color: rgba(255, 255, 255, 0.4) !important;
	overflow: hidden;
	max-height: 500px;
	margin-top: 6px;
	grid-area: desc;
}

.setting-desc-new a {
	font-size: inherit !important;
	font-family: inherit !important;
}

.setting-category-collapsed {
	display: none;
}

/* keybind display */
.keyIcon.kpc-keyIcon:hover {
	transform: scale(1.25);
	cursor: pointer;
}

.keyIcon.kpc-keyIcon {
	display: inline-block;
	transition: 0s;
}

/* ── KPC action button grid ── */
.kpc-action-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 6px;
  padding: 0 12px 12px;
}
.kpc-action-btn {
  background: var(--kpc-surface-card);
  color: var(--kpc-text-primary);
  border: 2px solid var(--kpc-border-medium);
  padding: 10px 12px;
  border-radius: 6px;
  cursor: pointer;
  font-size: 13px;
  font-weight: 600;
  text-align: center;
  transition: background 0.15s, border-color 0.15s;
  user-select: none;
}
.kpc-action-btn:hover {
  background: var(--kpc-surface-hover);
  border-color: var(--kpc-border-focus);
}
.kpc-action-btn:active {
  transform: scale(0.97);
}
.kpc-action-btn.full {
  grid-column: 1 / -1;
}
.kpc-action-btn.kpc-ab-purple { border-color: #ab47bc; }
.kpc-action-btn.kpc-ab-purple:hover { border-color: #ce93d8; }
.kpc-action-btn.kpc-ab-cyan { border-color: #00bcd4; }
.kpc-action-btn.kpc-ab-cyan:hover { border-color: #4dd0e1; }
.kpc-action-btn.kpc-ab-pink { border-color: #ec407a; }
.kpc-action-btn.kpc-ab-pink:hover { border-color: #f48fb1; }
.kpc-action-btn.kpc-ab-red { border-color: var(--kpc-red); }
.kpc-action-btn.kpc-ab-red:hover { border-color: var(--kpc-red-hover); }
.kpc-action-btn.kpc-ab-orange { border-color: var(--kpc-orange); }
.kpc-action-btn.kpc-ab-orange:hover { border-color: var(--kpc-orange-hover); }

/* floating toasts css that is required */
.kpc-holder-update {
	position: absolute;
	font-size: 1.125rem !important;
	color: rgba(255, 255, 255, 0.7);
	display: block !important;
	top: 20px;
	left: 20px;
	background-color: black;
	padding: 1rem;
	border-radius: 0.5rem;
	width: max-content;
	z-index: 10;
}

/* settings refresh popup */
.refresh-popup {
	height: min-content;
	left: 50%;
	transform: translateX(-50%);
	color: rgba(255,255,255,0.6)
}
.refresh-popup span {
	display: flex;
	align-items: center;
	column-gap: 0.5rem;
	color: rgba(255,255,255,0.6);
}
.refresh-popup,
.refresh-popup span,
.refresh-popup a {
	vertical-align: middle;
	font-size: .8rem;
	line-height: .8rem;
	z-index: 12;
}
.refresh-popup svg { fill: rgba(255,255,255,0.6); }
.refresh-popup code {
    color: white;
    font-size: 1.2rem;
    line-height: 1.2rem;
	font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace;
    background-color: #232323;
    padding: 0.08rem 0.4rem;
    border-radius: 3px;
    border: 2px solid #333333
}
/* ── Keybind capture dialog ── */
.kpc-keybind-overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: var(--kpc-z-overlay);
  background: rgba(0,0,0,0.7);
  display: flex;
  align-items: center;
  justify-content: center;
}
.kpc-keybind-dialog {
  background: var(--kpc-surface-dialog);
  border: 1px solid var(--kpc-border-medium);
  border-radius: 10px;
  padding: 24px 32px;
  min-width: 400px;
  position: relative;
}
.kpc-keybind-dialog-title {
  color: var(--kpc-text-primary);
  font-size: 18px;
  margin-bottom: 6px;
}
.kpc-keybind-dialog-sub {
  color: var(--kpc-text-muted);
  font-size: 13px;
  margin-bottom: 16px;
}
.kpc-keybind-dialog-sub code {
  color: #64b5f6;
}
.kpc-keybind-dialog-modifiers {
  display: flex;
  gap: 8px;
  font-size: 14px;
}
.kpc-keybind-modifier {
  background: var(--kpc-surface-raised);
  color: var(--kpc-text-faint);
  flex: 1;
  text-align: center;
  padding: 10px 0;
  border-radius: 6px;
  transition: background 0.15s, color 0.15s;
}
.kpc-keybind-modifier.active {
  background: #1976d2;
  color: #fff;
}
.kpc-keybind-dialog-cancel {
  position: absolute;
  top: 12px;
  right: 16px;
  color: #64b5f6;
  cursor: pointer;
  font-size: 14px;
}
.kpc-keybind-dialog-cancel:hover {
  text-decoration: underline;
}
/* ── Preserved: color input, userscript meta ── */
.kpc-color-input {
  width: 36px;
  height: 28px;
  border: 1px solid var(--kpc-border-default);
  border-radius: 4px;
  background: transparent;
  cursor: pointer;
  padding: 0;
  flex-shrink: 0;
}
.kpc-color-input::-webkit-color-swatch-wrapper {
  padding: 2px;
}
.kpc-color-input::-webkit-color-swatch {
  border: none;
  border-radius: 2px;
}
.kpc-us-meta {
  color: var(--kpc-text-dim);
  font-size: 11px;
  margin-top: 2px;
}
.kpc-us-settings {
  padding: 4px 0 4px 20px;
}
#chatList, #chatList * {
  user-select: text !important;
  cursor: text;
}
#chatList.kpc-chat-paused {
  border-left: 2px solid var(--kpc-yellow);
}
`,Xe=`
@keyframes matchmakerPopupSlideDown {
  0% { transform: translate(-50%, -500%); }
  100% { transform: translate(-50%, 0%); }
}
.onGame #matchmakerPopupContainer:not(.searching) {
  opacity: 0 !important;
}
#matchmakerPopupContainer {
  position: absolute;
  top: 10em;
  left: 50%;
  z-index: var(--kpc-z-popup);
  box-sizing: border-box;
  width: 35em;
  aspect-ratio: 2.5/1;
  border-radius: 1.2em;
  overflow: hidden;
  background-size: 100% 100%;
  pointer-events: all;
  background-color: var(--kpc-surface-raised);
  animation: matchmakerPopupSlideDown 0.5s ease forwards;
}
#matchmakerPopupTitle {
  font-size: 1.8em;
  color: white;
  padding: 0.3em 0.7em;
  background: rgba(0,0,0,0.5);
  margin-bottom: 0.3em;
}
#matchmakerPopupDescription {
  background: rgba(0,0,0,0.5);
  color: var(--kpc-yellow);
  box-sizing: border-box;
  padding: 0.6em 1em;
}
#matchmakerPopupOptions {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  display: flex;
}
.matchmakerPopupButton {
  text-align: center;
  border: 0.3em solid;
  box-sizing: border-box;
  margin: 0.5em;
  color: white;
  border-radius: 0.3em;
  font-size: 1.3em;
  background-color: rgba(0,0,0,0.5);
  padding: 0.2em 1.4em;
  transition: all 0.08s;
}
#matchmakerConfirmButton {
  border-color: var(--kpc-green);
  flex-grow: 1;
}
#matchmakerCancelButton {
  border-color: var(--kpc-red);
}
.matchmakerPopupButton:hover {
  cursor: pointer;
  border-color: white !important;
  transform: scale(0.95);
}
.matchmakerPopupButton:active {
  transform: scale(0.85);
}

/* ── Search phase ── */
#matchmakerPopupContainer.searching {
  background-image: none !important;
  background: var(--kpc-surface-raised);
  width: 24em;
  aspect-ratio: auto;
  padding: 1em 1.5em;
}
#matchmakerPopupContainer.searching #matchmakerPopupTitle,
#matchmakerPopupContainer.searching #matchmakerPopupDescription,
#matchmakerPopupContainer.searching #matchmakerPopupOptions {
  display: none;
}
#matchmakerPopupContainer:not(.searching) #matchmakerSearchContainer {
  display: none;
}
#matchmakerSearchStatus {
  font-size: 1.4em;
  color: var(--kpc-blue);
  margin-bottom: 0.6em;
  text-align: center;
}
#matchmakerSearchFeed {
  display: flex;
  flex-direction: column;
  gap: 0.15em;
  overflow: hidden;
  min-height: 5.6em;
  margin-bottom: 0.6em;
}
@keyframes mmFeedSlideIn {
  from { opacity: 0; transform: translateX(1em); }
  to { opacity: 1; transform: translateX(0); }
}
.mm-feed-entry {
  display: flex;
  gap: 0.8em;
  padding: 0.2em 0.5em;
  font-size: 0.95em;
  font-family: 'GameFont', monospace;
  border-radius: 0.2em;
  animation: mmFeedSlideIn 0.12s ease forwards;
}
.mm-feed-entry.mm-pass { background: rgba(76,175,80,0.1); }
.mm-feed-entry.mm-pass .mm-feed-region { color: var(--kpc-blue); }
.mm-feed-entry.mm-pass .mm-feed-map { color: var(--kpc-text-primary, rgba(255,255,255,0.9)); }
.mm-feed-entry.mm-pass .mm-feed-players { color: var(--kpc-green); }
.mm-feed-entry.mm-fail { background: rgba(255,255,255,0.02); }
.mm-feed-entry.mm-fail .mm-feed-region { color: var(--kpc-text-dim, rgba(255,255,255,0.3)); }
.mm-feed-entry.mm-fail .mm-feed-map { color: var(--kpc-text-muted, rgba(255,255,255,0.5)); }
.mm-feed-entry.mm-fail .mm-feed-players { color: var(--kpc-red); }
.mm-feed-entry:last-child::before {
  content: '\\25B8 ';
  color: var(--kpc-yellow);
}
.mm-feed-region { min-width: 2.5em; font-weight: bold; }
.mm-feed-map { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mm-feed-players { min-width: 3em; text-align: right; font-weight: 600; }
#matchmakerSearchCounter {
  font-size: 0.85em;
  color: var(--kpc-yellow);
  text-align: center;
  margin-bottom: 0.5em;
}
#matchmakerSearchCancel {
  text-align: center;
  border: 0.2em solid var(--kpc-red);
  color: white;
  border-radius: 0.3em;
  font-size: 1.1em;
  background: rgba(0,0,0,0.3);
  padding: 0.2em 1.2em;
  cursor: pointer;
  margin: 0 auto;
  width: fit-content;
  transition: all 0.08s;
}
#matchmakerSearchCancel:hover {
  border-color: white;
  transform: scale(0.95);
}
#matchmakerSearchCancel:active {
  transform: scale(0.85);
}
`,ze=`
.kcc-translation {
  color: #88ff88;
  font-style: italic;
  margin-left: 8px;
  margin-top: 2px;
}
`,Ze=`
.kpc-acc-form { display: flex; flex-direction: column; gap: 8px; margin-bottom: 12px; }
.kpc-acc-form input {
  background: var(--kpc-surface-input); border: 1px solid var(--kpc-border); border-radius: 4px;
  color: #fff; padding: 6px 10px; font-size: 13px; outline: none; font-family: inherit;
}
.kpc-acc-form input:focus { border-color: var(--kpc-accent); }
.kpc-acc-form input::placeholder { color: rgba(255,255,255,0.3); }
.kpc-acc-form-buttons { display: flex; gap: 8px; }
.kpc-acc-form-buttons button {
  padding: 6px 16px; border: none; border-radius: 4px; cursor: pointer;
  font-size: 13px; font-family: inherit;
}
.kpc-acc-form-buttons .kpc-acc-save {
  background: var(--kpc-accent); color: #fff;
}
.kpc-acc-form-buttons .kpc-acc-save:hover { filter: brightness(1.2); }
.kpc-acc-form-buttons .kpc-acc-cancel {
  background: var(--kpc-surface-hover); color: #fff;
}
.kpc-acc-form-buttons .kpc-acc-cancel:hover { background: var(--kpc-surface-hover-strong); }
.kpc-acc-item {
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 12px; background: var(--kpc-surface-card); border-radius: 6px; margin-bottom: 6px;
}
.kpc-acc-item-info { display: flex; align-items: center; gap: 8px; }
.kpc-acc-item-label { color: #fff; font-size: 14px; font-weight: 500; }
.kpc-acc-item-role {
  font-size: 11px; padding: 2px 6px; border-radius: 3px;
  background: rgba(255,255,255,0.1); color: rgba(255,255,255,0.6);
}
.kpc-acc-item-actions { display: flex; gap: 6px; }
.kpc-acc-item-actions button {
  padding: 4px 12px; border: none; border-radius: 4px; cursor: pointer;
  font-size: 12px; font-family: inherit;
}
.kpc-acc-switch { background: var(--kpc-accent); color: #fff; }
.kpc-acc-switch:hover { filter: brightness(1.2); }
.kpc-acc-delete { background: rgba(255,80,80,0.2); color: #ff5050; }
.kpc-acc-delete:hover { background: rgba(255,80,80,0.35); }
.kpc-acc-empty { color: rgba(255,255,255,0.4); font-size: 13px; text-align: center; padding: 16px 0; }
.kpc-alt-overlay-backdrop {
  position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 99998;
  background: rgba(0,0,0,0.5);
}
.kpc-alt-overlay {
  position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%);
  background: var(--kpc-surface-dialog, #1a1a1a); border-radius: 8px;
  padding: 16px; min-width: 280px; max-width: 360px; z-index: 99999;
  box-shadow: 0 8px 32px rgba(0,0,0,0.6);
}
.kpc-alt-overlay h3 {
  margin: 0 0 12px; color: #fff; font-size: 16px; font-weight: 600;
}
`,_e=`
.kpc-hp-counter .pointVal {
  color: #ff4444; font-size: 15px; font-weight: bold;
}
`,$e=`
#claimAllBtn.disabled { opacity: 0.4; pointer-events: none; }
`,et=`
#kpc-elo-tracker { width: 100%; margin: 8px 0; }
.kpc-elo-info-row { display: flex; align-items: center; gap: 8px; }
.kpc-rank-container { display: flex; align-items: center; gap: 4px; white-space: nowrap; font-size: 12px; color: #ccc; }
.kpc-elo-rank-img { width: 20px; height: 20px; }
.kpc-elo-bar-bg { flex: 1; height: 14px; background: rgba(255,255,255,0.1); border-radius: 7px; position: relative; overflow: hidden; }
.kpc-elo-bar-fill { height: 100%; background: linear-gradient(90deg, #388E3C, #4CAF50); border-radius: 7px; transition: width 0.3s; }
.kpc-elo-bar-text { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; font-size: 10px; color: #fff; text-shadow: 0 1px 2px rgba(0,0,0,0.5); }
#kpc-rank-list-btn { position: absolute; bottom: 8px; right: 8px; cursor: pointer; padding: 6px 14px; border-radius: 6px; font-size: 12px; background: rgba(76,175,80,0.3); color: #4CAF50; border: 1px solid rgba(76,175,80,0.4); z-index: 1; }
#kpc-rank-list-btn:hover { background: rgba(76,175,80,0.5); color: #fff; }
#kpc-rank-overlay { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0,0,0,0.75); z-index: 9998; display: flex; justify-content: center; align-items: center; }
.kpc-rank-popup { background: #1a1a2e; border-radius: 12px; padding: 20px; min-width: 340px; max-width: 500px; box-shadow: 0 8px 32px rgba(0,0,0,0.6); }
.kpc-rank-popup-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; }
.kpc-rank-popup-header h2 { margin: 0; color: #fff; font-size: 16px; }
.kpc-rank-popup-close { cursor: pointer; color: #888; font-size: 18px; padding: 4px 8px; }
.kpc-rank-popup-close:hover { color: #fff; }
.kpc-rank-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; max-height: 60vh; overflow-y: auto; }
.kpc-rank-grid-item { display: flex; align-items: center; gap: 8px; padding: 6px 10px; background: rgba(255,255,255,0.05); border-radius: 6px; }
.kpc-rank-grid-item img { width: 28px; height: 28px; }
.kpc-rank-name { font-size: 13px; font-weight: 600; }
.kpc-rank-elo { font-size: 11px; color: #888; }

/* Ranked queue button in ranked menu footer */
#kpc-ranked-queue-btn {
  background-color: #5ce05a;
  color: #fff;
  border: none;
  border-radius: 9px;
  padding: 12px 14px;
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: background 0.2s ease;
}
#kpc-ranked-queue-btn:hover { background-color: #4bc94a; }
`,Te=`${je}
${Xe}
${ze}
${Ze}
${_e}
${$e}
${et}`,tt=7;let K,re,he=!1;function At(){const a=new Date;return`${a.getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}-${String(a.getDate()).padStart(2,"0")}`}function it(a){try{const e=Date.now()-tt*864e5;for(const t of C.readdirSync(a)){const A=t.match(/^electron-(\d{4}-\d{2}-\d{2})\.log$/);if(!A)continue;if(new Date(A[1]+"T00:00:00").getTime()<e)try{C.unlinkSync(q.join(a,t))}catch{}}}catch{}}function L(){if(he)return;const a=q.join(i.app.getPath("userData"),"logs");C.existsSync(a)||C.mkdirSync(a,{recursive:!0}),it(a);const e=At();re=q.join(a,`electron-${e}.log`),K=C.createWriteStream(re,{flags:"a"});const t=`
${"=".repeat(60)}
  Session started ${new Date().toISOString()}
${"=".repeat(60)}
`;K.write(t),he=!0}function ee(){return new Date().toISOString()}function te(...a){return a.map(e=>{if(e instanceof Error)return`${e.message}
${e.stack}`;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}).join(" ")}function at(a){return{log:(...e)=>{L();const t=te(...e);console.log(t),H||a().write(`[${ee()}] ${t}
`)},warn:(...e)=>{L();const t=te(...e);console.warn(t),H||a().write(`[${ee()}] WARN: ${t}
`)},error:(...e)=>{L();const t=te(...e);console.error(t),H||a().write(`[${ee()}] ERROR: ${t}
`)}}}const p=at(()=>K);function ot(){return L(),re}let H=!1;function nt(){H=!0,K&&K.end()}const qe={github:{checkUrl:"https://api.github.com/repos/bigjakk/Krunker-Civilian-Client/releases/latest",allowedHosts:["github.com","githubusercontent.com"],checksumSource:"digest"},gitea:{checkUrl:"https://gitea.crjlab.net/api/v1/repos/bigjakk/Krunker-Civilian-Client-Test/releases/latest",allowedHosts:["gitea.crjlab.net"],checksumSource:"file"}},rt="gitea",P=qe[rt]||qe.github,Ae={asar:/^app\.asar$/i,setup:/Setup\.exe$/i,checksums:/^checksums\.sha256$/i},se=1e4,st=3e5,ct=`param(
    [int]$ProcessId,
    [string]$ResourcesDir,
    [string]$ExePath
)

try {
    $proc = Get-Process -Id $ProcessId -ErrorAction SilentlyContinue
    if ($proc) { $proc.WaitForExit(30000) | Out-Null }
} catch {}

Start-Sleep -Milliseconds 500

$asar = Join-Path $ResourcesDir "app.asar"
$pending = Join-Path $ResourcesDir "app-pending.asar"
$backup = Join-Path $ResourcesDir "app-backup.asar"

if (-not (Test-Path $pending)) { exit 1 }

try {
    if (Test-Path $backup) { Remove-Item $backup -Force }
    Move-Item $asar $backup -Force
    Move-Item $pending $asar -Force
    if (Test-Path $backup) { Remove-Item $backup -Force }
} catch {
    if ((Test-Path $backup) -and -not (Test-Path $asar)) {
        Move-Item $backup $asar -Force
    }
    exit 1
}

Start-Process $ExePath
`,lt=`#!/bin/bash
PID="$1"
RESOURCES_DIR="$2"
EXE_PATH="$3"

while kill -0 "$PID" 2>/dev/null; do sleep 0.2; done
sleep 0.5

ASAR="$RESOURCES_DIR/app.asar"
PENDING="$RESOURCES_DIR/app-pending.asar"
BACKUP="$RESOURCES_DIR/app-backup.asar"

[ -f "$PENDING" ] || exit 1

rm -f "$BACKUP"
mv "$ASAR" "$BACKUP" && mv "$PENDING" "$ASAR" && rm -f "$BACKUP" || {
    [ -f "$BACKUP" ] && [ ! -f "$ASAR" ] && mv "$BACKUP" "$ASAR"
    exit 1
}

"$EXE_PATH" &
`;function j(a){try{const e=new URL(a);return P.allowedHosts.some(t=>e.hostname===t||e.hostname.endsWith("."+t))}catch{return!1}}function pt(a,e){const t=a.split(".").map(Number),A=e.split(".").map(Number),o=Math.max(t.length,A.length);for(let r=0;r<o;r++){const d=t[r]||0,g=A[r]||0;if(d<g)return!0;if(d>g)return!1}return!1}function dt(a){return new Promise((e,t)=>{function A(o,r=0){if(r>5){t(new Error("Too many redirects"));return}const d=v.get(o,{headers:{"User-Agent":"KrunkerCivilianClient"}},g=>{if(g.statusCode&&g.statusCode>=300&&g.statusCode<400&&g.headers.location){if(!j(g.headers.location)){t(new Error("Redirect to untrusted host: "+g.headers.location));return}A(g.headers.location,r+1);return}if(g.statusCode!==200){t(new Error("HTTP "+g.statusCode));return}let u="";g.on("data",f=>{u+=f}),g.on("end",()=>e(u)),g.on("error",t)});d.setTimeout(se,()=>{d.destroy(),t(new Error("Request timed out"))}),d.on("error",t)}A(a)})}async function gt(a){const e=await dt(a),t=new Map;for(const A of e.split(`
`)){const o=A.trim().match(/^([a-f0-9]{64})\s+(.+)$/i);o&&t.set(o[2].trim(),o[1].toLowerCase())}return t}function ht(a){return new Promise(e=>{p.log("[KCC-Update] Checking for updates at:",P.checkUrl),p.log("[KCC-Update] Current version:",a);const t=v.get(P.checkUrl,{headers:{"User-Agent":"KrunkerCivilianClient/"+a}},o=>{if(p.log("[KCC-Update] Check response status:",o.statusCode),o.statusCode&&o.statusCode>=300&&o.statusCode<400&&o.headers.location){const r=o.headers.location;if(p.log("[KCC-Update] Redirected to:",r),!j(r)){p.error("[KCC-Update] Redirect to untrusted host blocked:",r),e(null);return}v.get(r,{headers:{"User-Agent":"KrunkerCivilianClient/"+a}},d=>{p.log("[KCC-Update] Redirect response status:",d.statusCode),A(d)}).on("error",d=>{p.error("[KCC-Update] Redirect error:",d),e(null)});return}A(o)});async function A(o){if(o.statusCode!==200){p.error("[KCC-Update] Check returned status",o.statusCode),e(null);return}let r="";o.on("data",d=>{r+=d}),o.on("end",async()=>{try{const d=JSON.parse(r),u=(d.tag_name||"").replace(/^v/i,"");if(p.log("[KCC-Update] Latest release:",u,"| Current:",a),!u||!pt(a,u)){p.log("[KCC-Update] Already up to date"),e(null);return}const f=d.assets||[],c=f.find(D=>Ae.asar.test(D.name)),m=f.find(D=>Ae.setup.test(D.name)),B=c||m,T=c?"minor":"major";if(!B){p.error("[KCC-Update] No app.asar or Setup.exe asset found in release",u),e(null);return}if(!j(B.browser_download_url)){p.error("[KCC-Update] Download URL points to untrusted host:",B.browser_download_url),e(null);return}let Q="";if(P.checksumSource==="digest"){if(Q=(B.digest||"").replace(/^sha256:/i,""),!Q){p.error("[KCC-Update] No SHA-256 digest found for asset"),e(null);return}}else{const D=f.find(G=>Ae.checksums.test(G.name));if(D)try{Q=(await gt(D.browser_download_url)).get(B.name)||""}catch(G){p.error("[KCC-Update] Failed to fetch checksums:",G)}Q||p.warn("[KCC-Update] No checksum available — proceeding without verification")}p.log("[KCC-Update] Update available:",u,"| Type:",T,"| SHA-256:",Q?Q.substring(0,16)+"...":"none"),e({version:u,updateType:T,downloadUrl:B.browser_download_url,fileSize:B.size,sha256:Q})}catch(d){p.error("[KCC-Update] Failed to parse release data:",d),e(null)}}),o.on("error",d=>{p.error("[KCC-Update] Response error:",d),e(null)})}t.setTimeout(se,()=>{p.error("[KCC-Update] Check timed out after",se,"ms"),t.destroy(),e(null)}),t.on("error",o=>{p.error("[KCC-Update] Check error:",o),e(null)})})}function qt(a,e){return new Promise((t,A)=>{const o=Ye.createHash("sha256"),r=k.createReadStream(a);r.on("data",d=>o.update(d)),r.on("end",()=>{const d=o.digest("hex");p.log("[KCC-Update] SHA-256 expected:",e),p.log("[KCC-Update] SHA-256 actual:  ",d),t(d===e)}),r.on("error",A)})}function ue(a,e,t,A){return new Promise((o,r)=>{const d=e+".tmp";function g(u,f=0){if(f>5){r(new Error("Too many redirects"));return}p.log("[KCC-Update] Downloading from:",u);const c=v.get(u,{headers:{"User-Agent":"KrunkerCivilianClient"}},m=>{if(m.statusCode&&m.statusCode>=300&&m.statusCode<400&&m.headers.location){const D=m.headers.location;if(p.log("[KCC-Update] Download redirected to:",D),!j(D)){p.error("[KCC-Update] Download redirect to untrusted host blocked:",D),r(new Error("Download redirect to untrusted host: "+D));return}g(D,f+1);return}if(m.statusCode!==200){p.error("[KCC-Update] Download returned status",m.statusCode,"from:",u),r(new Error("Download returned status "+m.statusCode));return}const B=parseInt(m.headers["content-length"]||"0",10);let T=0;const Q=k.createWriteStream(d);m.on("data",D=>{T+=D.length,B>0&&t(Math.round(100*T/B))}),m.pipe(Q),Q.on("finish",()=>{Q.close(async()=>{try{if(A){if(!await qt(d,A)){p.error("[KCC-Update] Checksum mismatch — file may be corrupted or tampered");try{k.unlinkSync(d)}catch{}r(new Error("SHA-256 checksum mismatch"));return}p.log("[KCC-Update] Checksum verified")}k.existsSync(e)&&k.unlinkSync(e),k.renameSync(d,e),o()}catch(D){r(D)}})}),Q.on("error",D=>{try{k.unlinkSync(d)}catch{}r(D)}),m.on("error",D=>{try{k.unlinkSync(d)}catch{}r(D)})});c.setTimeout(st,()=>{c.destroy();try{k.unlinkSync(d)}catch{}r(new Error("Download timed out"))}),c.on("error",m=>{try{k.unlinkSync(d)}catch{}r(m)})}g(a)})}function ut(a){p.log("[KCC-Update] Launching installer:",a),J.spawn(a,[],{detached:!0,stdio:"ignore"}).unref(),i.app.quit()}function mt(a){const e=q.dirname(a),t=i.app.getPath("exe"),A=q.join(i.app.getPath("temp"),"kcc-update");if(k.existsSync(A)||k.mkdirSync(A,{recursive:!0}),p.log("[KCC-Update] Applying minor update via swap script"),p.log("[KCC-Update] Resources dir:",e),p.log("[KCC-Update] Exe path:",t),p.log("[KCC-Update] PID:",process.pid),process.platform==="win32"){const o=q.join(A,"swap-asar.ps1");k.writeFileSync(o,ct),J.spawn("powershell.exe",["-ExecutionPolicy","Bypass","-File",o,"-ProcessId",String(process.pid),"-ResourcesDir",e,"-ExePath",t],{detached:!0,stdio:"ignore"}).unref()}else{const o=q.join(A,"swap-asar.sh");k.writeFileSync(o,lt,{mode:493}),J.spawn("bash",[o,String(process.pid),e,t],{detached:!0,stdio:"ignore"}).unref()}i.app.quit()}const wt=`<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
  * { margin: 0; padding: 0; box-sizing: border-box; }
  body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    background: #1a1a2e;
    color: #e0e0e0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    height: 100vh;
    padding: 20px;
  }
  h2 {
    font-size: 16px;
    font-weight: 600;
    margin-bottom: 16px;
    color: #fff;
  }
  #status {
    font-size: 13px;
    margin-bottom: 12px;
    color: #ccc;
    text-align: center;
  }
  .progress-container {
    width: 100%;
    height: 8px;
    background: #16213e;
    border-radius: 4px;
    overflow: hidden;
  }
  .progress-bar {
    height: 100%;
    width: 0%;
    background: #0f3460;
    border-radius: 4px;
    transition: width 0.3s ease;
  }
</style>
</head>
<body>
  <h2>Krunker Civilian Client</h2>
  <div id="status">Checking for updates...</div>
  <div class="progress-container">
    <div class="progress-bar" id="progressBar"></div>
  </div>
</body>
</html>`,ft="data:text/html;charset=utf-8,"+encodeURIComponent(wt);function Ct(){const a=new i.BrowserWindow({width:450,height:180,resizable:!1,alwaysOnTop:!0,backgroundColor:"#1a1a2e",autoHideMenuBar:!0,title:"Krunker Civilian Client - Update",webPreferences:{nodeIntegration:!1,contextIsolation:!0,sandbox:!0}});a.removeMenu(),a.loadURL(ft);function e(t,A){a.isDestroyed()||a.webContents.executeJavaScript(`(() => {
        const s = document.getElementById('status');
        const p = document.getElementById('progressBar');
        if (s) s.textContent = ${JSON.stringify(t)};
        if (p && typeof ${JSON.stringify(A)} === 'number') p.style.width = ${JSON.stringify(A)} + '%';
      })()`).catch(()=>{})}return{window:a,sendProgress:e}}const Bt="1477679025248800982",Dt=0,ie=1,kt=2,me=5e3,It=3e4;function Qt(a){return process.platform==="win32"?`\\\\?\\pipe\\discord-ipc-${a}`:`${process.env.XDG_RUNTIME_DIR||process.env.TMPDIR||process.env.TMP||process.env.TEMP||"/tmp"}/discord-ipc-${a}`}function ae(a,e){const t=JSON.stringify(e),A=Buffer.from(t),o=Buffer.alloc(8);return o.writeUInt32LE(a,0),o.writeUInt32LE(A.length,4),Buffer.concat([o,A])}class bt{socket=null;connected=!1;reconnectTimer=null;lastUpdate=0;nonce=0;destroyed=!1;recvBuf=Buffer.alloc(0);pendingActivity=null;flushTimer=null;get isConnected(){return this.connected}connect(){this.destroyed||this.tryConnect(0)}tryConnect(e){if(this.destroyed||e>9){this.scheduleReconnect();return}const t=Qt(e),A=new Ke.Socket;let o=!1;const r=()=>{o||(o=!0,A.destroy(),this.tryConnect(e+1))};A.once("error",r),A.connect(t,()=>{if(o||this.destroyed){A.destroy();return}o=!0,this.socket=A,this.recvBuf=Buffer.alloc(0),A.removeListener("error",r),A.on("error",g=>{p.warn("[KCC-Discord] Socket error:",g.message),this.handleDisconnect()}),A.on("close",()=>{this.handleDisconnect()}),A.on("data",g=>{this.onData(g)});const d=ae(Dt,{v:1,client_id:Bt});A.write(d)}),A.setTimeout(5e3,r)}onData(e){for(this.recvBuf=Buffer.concat([this.recvBuf,e]);this.recvBuf.length>=8;){const t=this.recvBuf.readUInt32LE(0),A=this.recvBuf.readUInt32LE(4);if(this.recvBuf.length<8+A)break;const o=this.recvBuf.slice(8,8+A);this.recvBuf=this.recvBuf.slice(8+A);try{const r=JSON.parse(o.toString());this.handleMessage(t,r)}catch{}}}handleMessage(e,t){e===ie?t.cmd==="DISPATCH"&&t.evt==="READY"&&(this.connected=!0,p.log("[KCC-Discord] Connected to Discord"),this.pendingActivity&&(this.sendActivity(this.pendingActivity),this.pendingActivity=null)):e===kt&&(p.warn("[KCC-Discord] Discord closed connection:",t.message||""),this.handleDisconnect())}handleDisconnect(){!this.connected&&!this.socket||(this.connected=!1,this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.socket&&(this.socket.destroy(),this.socket=null),this.recvBuf=Buffer.alloc(0),p.log("[KCC-Discord] Disconnected"),this.scheduleReconnect())}scheduleReconnect(){this.destroyed||this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,!this.destroyed&&!this.connected&&this.tryConnect(0)},It))}setActivity(e){if(this.destroyed||(this.pendingActivity=e,!this.connected||!this.socket))return;const A=Date.now()-this.lastUpdate;if(A<me){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.pendingActivity&&this.connected&&this.socket&&(this.sendActivity(this.pendingActivity),this.pendingActivity=null)},me-A));return}this.sendActivity(e),this.pendingActivity=null}sendActivity(e){if(!this.socket||this.destroyed)return;this.lastUpdate=Date.now();const t={};e.details&&(t.details=e.details),e.state&&(t.state=e.state),e.startTimestamp&&(t.timestamps={start:e.startTimestamp}),e.largeImageKey&&(t.assets={large_image:e.largeImageKey,large_text:e.largeImageText||"Krunker Civilian Client"});const A=ae(ie,{cmd:"SET_ACTIVITY",args:{pid:process.pid,activity:t},nonce:String(++this.nonce)});try{this.socket.write(A)}catch(o){p.warn("[KCC-Discord] Write error:",o.message)}}clearActivity(){if(!this.connected||!this.socket||this.destroyed)return;const e=ae(ie,{cmd:"SET_ACTIVITY",args:{pid:process.pid,activity:null},nonce:String(++this.nonce)});try{this.socket.write(e)}catch{}}disconnect(){if(this.destroyed=!0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.socket){try{this.clearActivity()}catch{}this.socket.destroy(),this.socket=null}this.connected=!1,this.recvBuf=Buffer.alloc(0)}}function St(a){const e=[{id:"disabled",label:"Disabled"}],t=q.join(a,"themes");try{const A=C.readdirSync(t);for(const o of A)q.extname(o).toLowerCase()===".css"&&e.push({id:`user:${o}`,label:q.basename(o,".css")})}catch{}return e}function we(a,e){if(a==="disabled"||!a)return"";const t="user:";if(!a.startsWith(t))return"";const A=q.basename(a.slice(t.length));if(!A)return"";try{return C.readFileSync(q.join(e,"themes",A),"utf-8")}catch{return""}}const Ee=new Set([".png",".jpg",".jpeg",".gif",".webp"]);function Tt(a){const e=[{id:"disabled",label:"Disabled (Default)"},{id:"swap:random",label:"Random (from backgrounds/)"}],t=q.join(a,"backgrounds");try{const A=C.readdirSync(t);for(const o of A)Ee.has(q.extname(o).toLowerCase())&&e.push({id:`swap:${o}`,label:o})}catch{}return e}function Et(a){switch(a.toLowerCase()){case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";default:return"image/png"}}function Gt(a){const e=q.join(a,"backgrounds");try{return C.readdirSync(e).filter(t=>Ee.has(q.extname(t).toLowerCase()))}catch{return[]}}function fe(a){const e=C.readFileSync(a);return`data:${Et(q.extname(a))};base64,${e.toString("base64")}`}function Ce(a,e,t){let A="";if(e)try{new URL(e),A=`url(${e})`}catch{}if(!A&&a&&a!=="disabled"){const o=q.join(t,"backgrounds");if(a==="swap:random"){const r=Gt(t);if(r.length>0){const d=r[Math.floor(Math.random()*r.length)];try{A=`url(${fe(q.join(o,d))})`}catch{}}}else if(a.startsWith("swap:")){const r=q.basename(a.slice(5));if(!r)return"";try{A=`url(${fe(q.join(o,r))})`}catch{}}}return A?`
#instructionHolder[style^="display: block"] {
    background-image: initial !important;
}
#instructionHolder {
    background-image: ${A} !important;
    background-size: cover !important;
    background-position: center !important;
}
#instructions {
    display: block;
    visibility: hidden;
}`:""}const Vt=`<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
  ${Se}
  * { margin: 0; padding: 0; box-sizing: border-box; }
  body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    background: var(--kpc-surface-dialog);
    color: var(--kpc-text-primary);
    height: 40px;
    overflow: hidden;
    display: flex;
    align-items: center;
    gap: 4px;
    padding: 0 6px;
    user-select: none;
    -webkit-app-region: no-drag;
  }

  /* ── Shared pill style for Game btn, tabs, and New Tab btn ── */
  .bar-pill {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    border: 1px solid var(--kpc-toggle-off);
    border-radius: 6px;
    padding: 4px 10px;
    cursor: pointer;
    font-size: 12px;
    font-weight: 500;
    transition: background 0.12s, border-color 0.12s;
    background: var(--kpc-surface-card);
    color: var(--kpc-text-secondary);
  }
  .bar-pill:hover {
    background: var(--kpc-surface-input);
    border-color: rgba(255,255,255,0.2);
  }

  /* ── Game button (green accent) ── */
  #gameBtn {
    background: rgba(76, 175, 80, 0.12);
    color: var(--kpc-green);
    border-color: rgba(76, 175, 80, 0.5);
    font-weight: 600;
  }
  #gameBtn:hover {
    background: rgba(76, 175, 80, 0.25);
    border-color: var(--kpc-green);
  }

  /* ── Tab strip ── */
  #tabStrip {
    flex: 1;
    display: flex;
    gap: 4px;
    overflow-x: auto;
    overflow-y: hidden;
    align-items: center;
    height: 100%;
    padding: 4px 0;
    scrollbar-width: none;
  }
  #tabStrip::-webkit-scrollbar { display: none; }

  /* ── Tab pills ── */
  .tab {
    position: relative;
    gap: 6px;
    max-width: 200px;
    min-width: 60px;
    height: 28px;
  }
  .tab.dragging {
    opacity: 0.4;
  }
  .tab.drop-before::before {
    content: '';
    position: absolute;
    left: -3px;
    top: 2px;
    bottom: 2px;
    width: 2px;
    background: var(--kpc-green);
    border-radius: 1px;
  }
  .tab.drop-after::after {
    content: '';
    position: absolute;
    right: -3px;
    top: 2px;
    bottom: 2px;
    width: 2px;
    background: var(--kpc-green);
    border-radius: 1px;
  }
  .tab.active {
    background: rgba(76, 175, 80, 0.12);
    border-color: rgba(76, 175, 80, 0.5);
    color: var(--kpc-text-primary);
  }
  .tab.active:hover {
    background: rgba(76, 175, 80, 0.2);
    border-color: var(--kpc-green);
  }

  .tab-title {
    flex: 1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .tab-spinner {
    width: 10px;
    height: 10px;
    border: 1.5px solid var(--kpc-border-medium);
    border-top-color: var(--kpc-green);
    border-radius: 50%;
    animation: spin 0.8s linear infinite;
    flex-shrink: 0;
    display: none;
  }
  .tab.loading .tab-spinner { display: block; }
  @keyframes spin { to { transform: rotate(360deg); } }

  .tab-close {
    flex-shrink: 0;
    width: 16px;
    height: 16px;
    line-height: 15px;
    text-align: center;
    border-radius: 3px;
    font-size: 13px;
    color: var(--kpc-text-dim);
    transition: background 0.1s, color 0.1s;
  }
  .tab-close:hover {
    background: var(--kpc-toggle-off);
    color: #fff;
  }

  /* ── New Tab button ── */
  #newTabBtn {
    width: 28px;
    height: 28px;
    justify-content: center;
    font-size: 16px;
    font-weight: 400;
    color: var(--kpc-text-faint);
    padding: 0;
    border-style: dashed;
  }
  #newTabBtn:hover {
    color: var(--kpc-text-primary);
  }
</style>
</head>
<body>
  <button id="gameBtn" class="bar-pill">Game</button>
  <div id="tabStrip"></div>
  <button id="newTabBtn" class="bar-pill" title="New Tab (Ctrl+T)">+</button>
<script>
  const { ipcRenderer } = require('electron');
  const strip = document.getElementById('tabStrip');

  document.getElementById('gameBtn').addEventListener('click', () => {
    ipcRenderer.send('tab-back-to-game');
  });

  document.getElementById('newTabBtn').addEventListener('click', () => {
    ipcRenderer.send('tab-new');
  });

  /* ── Drag state ── */
  let dragId = null;
  let dragStartX = 0;
  let dragging = false;
  const DRAG_THRESHOLD = 5;

  function clearDropIndicators() {
    strip.querySelectorAll('.drop-before,.drop-after').forEach(
      el => el.classList.remove('drop-before', 'drop-after')
    );
  }

  function getDropTarget(clientX) {
    const tabs = Array.from(strip.querySelectorAll('.tab'));
    for (const tab of tabs) {
      if (Number(tab.dataset.id) === dragId) continue;
      const r = tab.getBoundingClientRect();
      const mid = r.left + r.width / 2;
      if (clientX < mid) return { id: Number(tab.dataset.id), side: 'before', el: tab };
    }
    const last = tabs[tabs.length - 1];
    if (last && Number(last.dataset.id) !== dragId) {
      return { id: Number(last.dataset.id), side: 'after', el: last };
    }
    return null;
  }

  document.addEventListener('mousemove', (e) => {
    if (dragId === null) return;
    if (!dragging && Math.abs(e.clientX - dragStartX) >= DRAG_THRESHOLD) {
      dragging = true;
      const el = strip.querySelector('.tab[data-id="' + dragId + '"]');
      if (el) el.classList.add('dragging');
    }
    if (!dragging) return;
    clearDropIndicators();
    const target = getDropTarget(e.clientX);
    if (target) target.el.classList.add(target.side === 'before' ? 'drop-before' : 'drop-after');
  });

  document.addEventListener('mouseup', (e) => {
    if (dragId === null) return;
    const wasDragging = dragging;
    const srcId = dragId;
    clearDropIndicators();
    const dragEl = strip.querySelector('.tab.dragging');
    if (dragEl) dragEl.classList.remove('dragging');
    dragId = null;
    dragging = false;

    if (wasDragging) {
      const target = getDropTarget(e.clientX);
      if (target) {
        ipcRenderer.send('tab-reorder', srcId, target.id, target.side);
      }
    }
  });

  ipcRenderer.on('tabs-update', (_e, tabs) => {
    strip.innerHTML = '';
    for (const t of tabs) {
      const el = document.createElement('div');
      el.className = 'bar-pill tab' + (t.active ? ' active' : '') + (t.loading ? ' loading' : '');
      el.dataset.id = String(t.id);

      const spinner = document.createElement('div');
      spinner.className = 'tab-spinner';
      el.appendChild(spinner);

      const title = document.createElement('span');
      title.className = 'tab-title';
      title.textContent = t.title || 'Loading...';
      title.title = t.title || '';
      el.appendChild(title);

      const close = document.createElement('span');
      close.className = 'tab-close';
      close.textContent = '\\u00d7';
      close.addEventListener('click', (ev) => {
        ev.stopPropagation();
        ipcRenderer.send('tab-close', t.id);
      });
      el.appendChild(close);

      el.addEventListener('mousedown', (ev) => {
        if (ev.target.classList.contains('tab-close')) return;
        dragId = t.id;
        dragStartX = ev.clientX;
        dragging = false;
      });

      el.addEventListener('click', () => {
        if (!dragging) ipcRenderer.send('tab-switch', t.id);
      });

      strip.appendChild(el);
    }

    const activeEl = strip.querySelector('.tab.active');
    if (activeEl) activeEl.scrollIntoView({ inline: 'nearest', block: 'nearest' });
  });
<\/script>
</body>
</html>`,Mt="data:text/html;charset=utf-8,"+encodeURIComponent(Vt),Be="https://krunker.io/social.html",oe=40,yt=20;class X{tabs=[];activeTabId=null;tabBarView;containerView;tabWindow=null;visible=!1;nextId=1;mode;mainWin;ses;preloadPath;isGameURL;titlePolls=new Map;recentlyClosed=[];getTabWindowState;saveTabWindowState;getSavedTabs;saveTabs;isRememberEnabled;tabSaveTimer=null;restoredTabs=!1;constructor(e,t,A,o,r,d,g,u,f,c){this.mainWin=e,this.ses=t,this.preloadPath=A,this.mode=o,this.isGameURL=r,this.getTabWindowState=d,this.saveTabWindowState=g,this.getSavedTabs=u,this.saveTabs=f,this.isRememberEnabled=c,this.tabBarView=new i.WebContentsView({webPreferences:{nodeIntegration:!0,contextIsolation:!1,sandbox:!1}}),this.tabBarView.webContents.loadURL(Mt),this.containerView=new i.View,this.containerView.addChildView(this.tabBarView),this.tabBarView.webContents.on("before-input-event",(m,B)=>{B.type==="keyDown"&&this.handleTabShortcut(m,B)}),o==="same"&&this.initSameWindowMode(),this.registerIPC()}initSameWindowMode(){this.mainWin.contentView.addChildView(this.containerView),this.containerView.setVisible(!1),this.visible=!1,this.mainWin.on("resize",()=>this.updateLayout())}ensureTabWindow(){if(this.tabWindow&&!this.tabWindow.isDestroyed())return;const e=this.getTabWindowState();this.tabWindow=new i.BrowserWindow({width:e.width,height:e.height,x:e.x,y:e.y,frame:!0,backgroundColor:"#000000",autoHideMenuBar:!0,title:"KCC - Tabs",show:!1,webPreferences:{nodeIntegration:!1,contextIsolation:!0,sandbox:!0}}),this.tabWindow.removeMenu(),e.maximized&&this.tabWindow.maximize(),this.tabWindow.contentView.addChildView(this.containerView),this.containerView.setVisible(!0),this.tabWindow.on("resize",()=>{this.updateLayout(),this.debounceSaveTabWindow()}),this.tabWindow.on("move",()=>this.debounceSaveTabWindow()),this.tabWindow.on("close",()=>{if(this.tabSaveTimer&&clearTimeout(this.tabSaveTimer),this.tabWindow&&!this.tabWindow.isDestroyed()){const t=this.tabWindow.getBounds();this.saveTabWindowState({width:t.width,height:t.height,x:t.x,y:t.y,maximized:this.tabWindow.isMaximized()})}}),this.tabWindow.on("closed",()=>{this.destroyAllTabs(),this.tabWindow=null}),this.tabWindow.show()}debounceSaveTabWindow(){this.tabSaveTimer&&clearTimeout(this.tabSaveTimer),this.tabSaveTimer=setTimeout(()=>{if(!this.tabWindow||this.tabWindow.isDestroyed())return;const e=this.tabWindow.getBounds();this.saveTabWindowState({width:e.width,height:e.height,x:e.x,y:e.y,maximized:this.tabWindow.isMaximized()})},1e3)}registerIPC(){i.ipcMain.on("tab-switch",(e,t)=>this.switchToTab(t)),i.ipcMain.on("tab-close",(e,t)=>this.closeTab(t)),i.ipcMain.on("tab-new",()=>this.openTab(Be)),i.ipcMain.on("tab-reorder",(e,t,A,o)=>{this.reorderTab(t,A,o)}),i.ipcMain.on("tab-back-to-game",()=>{this.mode==="same"?this.hideTabs():this.mainWin.focus()})}openTab(e){if(!this.restoredTabs){this.restoredTabs=!0;const t=this.isRememberEnabled()?this.getSavedTabs():[];if(this.saveTabs([]),t.length>0){for(const o of t)this.openSingleTab(o);const A=this.tabs.find(o=>o.url===e);if(A)return this.switchToTab(A.id),this.showTabs(),A.id}}return this.openSingleTab(e)}openSingleTab(e){if(this.tabs.length>=yt){const r=this.tabs.find(d=>d.url===e);return r?(this.switchToTab(r.id),r.id):(p.warn("[KCC-Tabs] Tab limit reached, ignoring openTab"),-1)}const t=this.nextId++,A=this.createTabView(t),o={id:t,view:A,title:this.titleFromUrl(e),url:e,loading:!0};return this.tabs.push(o),this.mode==="new"&&this.ensureTabWindow(),this.switchToTab(t),this.showTabs(),A.webContents.loadURL(e),t}createTabView(e){const t=new i.WebContentsView({webPreferences:{preload:this.preloadPath,session:this.ses,contextIsolation:!1,nodeIntegration:!1,sandbox:!0,spellcheck:!1}}),A=t.webContents;return A.on("did-finish-load",()=>{A.insertCSS(Te).catch(()=>{}),A.send("main_did-finish-load-tab"),i.ipcMain.emit("throttle-state",{sender:A},"menu"),this.updateTabInfo(e,{loading:!1}),this.startTitleWatcher(e,A)}),A.on("did-start-loading",()=>{this.updateTabInfo(e,{loading:!0})}),A.on("did-stop-loading",()=>{this.updateTabInfo(e,{loading:!1})}),A.on("page-title-updated",(o,r)=>{this.isGenericTitle(r)||this.updateTabInfo(e,{title:r})}),A.on("did-navigate",(o,r)=>{this.updateTabInfo(e,{url:r,title:this.titleFromUrl(r)})}),A.setWindowOpenHandler(({url:o})=>(o.includes("krunker.io")?this.isGameURL(o)?(this.mainWin.loadURL(o),this.mode==="same"?this.hideTabs():this.mainWin.focus()):setImmediate(()=>this.openTab(o)):setImmediate(()=>i.shell.openExternal(o)),{action:"deny"})),A.on("will-navigate",(o,r)=>{r.includes("krunker.io")&&this.isGameURL(r)&&(o.preventDefault(),this.mainWin.loadURL(r),this.mode==="same"?this.hideTabs():this.mainWin.focus())}),A.on("context-menu",(o,r)=>{if(!r.linkURL)return;const d=[];r.linkURL.includes("krunker.io")&&!this.isGameURL(r.linkURL)&&d.push({label:"Open in New Tab",click:()=>this.openTab(r.linkURL)}),d.push({label:"Copy Link",click:()=>i.clipboard.writeText(r.linkURL)}),r.linkURL.includes("krunker.io")||d.push({label:"Open in Browser",click:()=>i.shell.openExternal(r.linkURL)}),d.length&&i.Menu.buildFromTemplate(d).popup()}),A.on("before-input-event",(o,r)=>{r.type==="keyDown"&&(this.handleTabShortcut(o,r)||r.key==="F12"&&!r.control&&!r.shift&&!r.alt&&(A.toggleDevTools(),o.preventDefault()))}),t}switchToTab(e){const t=this.tabs.find(A=>A.id===e);if(t){if(this.activeTabId!==null&&this.activeTabId!==e){const A=this.tabs.find(o=>o.id===this.activeTabId);A&&(this.containerView.removeChildView(A.view),this.freezeTab(A))}this.activeTabId=e,this.unfreezeTab(t),this.containerView.addChildView(t.view),this.updateLayout(),this.broadcastTabState()}}freezeTab(e){const t=e.view.webContents;if(!t.isDestroyed()){this.stopTitleWatcher(e.id);try{t.debugger.attach("1.3")}catch{}t.debugger.sendCommand("Page.setWebLifecycleState",{state:"frozen"}).catch(()=>{})}}unfreezeTab(e){const t=e.view.webContents;t.isDestroyed()||t.debugger.sendCommand("Page.setWebLifecycleState",{state:"active"}).catch(()=>{}).finally(()=>{try{t.debugger.detach()}catch{}t.isDestroyed()||this.startTitleWatcher(e.id,t)})}closeTab(e){const t=this.tabs.findIndex(o=>o.id===e);if(t===-1)return;const A=this.tabs[t];if(this.activeTabId===e&&(this.containerView.removeChildView(A.view),this.activeTabId=null),this.recentlyClosed.push({url:A.url,title:A.title}),this.recentlyClosed.length>10&&this.recentlyClosed.shift(),this.stopTitleWatcher(e),A.view.webContents.close(),this.tabs.splice(t,1),this.tabs.length>0){const o=Math.min(t,this.tabs.length-1);this.switchToTab(this.tabs[o].id)}else this.mode==="same"?this.hideTabs():this.tabWindow&&!this.tabWindow.isDestroyed()&&(this.tabWindow.contentView.removeChildView(this.containerView),this.tabWindow.close());this.broadcastTabState()}showTabs(){this.mode==="same"?(this.containerView.setVisible(!0),this.visible=!0,this.updateLayout()):(this.ensureTabWindow(),this.tabWindow&&!this.tabWindow.isDestroyed()&&(this.tabWindow.show(),this.tabWindow.focus()),this.visible=!0)}hideTabs(){this.mode==="same"?(this.containerView.setVisible(!1),this.visible=!1,this.mainWin.focus()):(this.mainWin.focus(),this.visible=!1)}nextTab(){if(this.tabs.length<2||this.activeTabId===null)return;const t=(this.tabs.findIndex(A=>A.id===this.activeTabId)+1)%this.tabs.length;this.switchToTab(this.tabs[t].id)}prevTab(){if(this.tabs.length<2||this.activeTabId===null)return;const t=(this.tabs.findIndex(A=>A.id===this.activeTabId)-1+this.tabs.length)%this.tabs.length;this.switchToTab(this.tabs[t].id)}closeCurrentTab(){this.activeTabId!==null&&this.closeTab(this.activeTabId)}reorderTab(e,t,A){const o=this.tabs.findIndex(u=>u.id===e),r=this.tabs.findIndex(u=>u.id===t);if(o===-1||r===-1||o===r)return;const[d]=this.tabs.splice(o,1);let g=this.tabs.findIndex(u=>u.id===t);A==="after"&&g++,this.tabs.splice(g,0,d),this.broadcastTabState()}switchToTabByIndex(e){this.tabs.length!==0&&((e<0||e>=this.tabs.length)&&(e=this.tabs.length-1),this.switchToTab(this.tabs[e].id))}reopenTab(){const e=this.recentlyClosed.pop();e&&this.openTab(e.url)}handleTabShortcut(e,t){return t.key==="Escape"&&!t.control&&!t.shift&&!t.alt?(this.mode==="same"?this.hideTabs():this.mainWin.focus(),e.preventDefault(),!0):t.key==="w"&&t.control&&!t.shift&&!t.alt?(this.closeCurrentTab(),e.preventDefault(),!0):t.key==="Tab"&&t.control&&!t.shift&&!t.alt?(this.nextTab(),e.preventDefault(),!0):t.key==="Tab"&&t.control&&t.shift&&!t.alt?(this.prevTab(),e.preventDefault(),!0):t.key==="t"&&t.control&&!t.shift&&!t.alt?(this.openTab(Be),e.preventDefault(),!0):t.key==="T"&&t.control&&t.shift&&!t.alt?(this.reopenTab(),e.preventDefault(),!0):t.key>="1"&&t.key<="8"&&t.control&&!t.shift&&!t.alt?(this.switchToTabByIndex(parseInt(t.key)-1),e.preventDefault(),!0):t.key==="9"&&t.control&&!t.shift&&!t.alt?(this.switchToTabByIndex(-1),e.preventDefault(),!0):!1}destroyAll(){if(this.destroyAllTabs(),i.ipcMain.removeAllListeners("tab-switch"),i.ipcMain.removeAllListeners("tab-close"),i.ipcMain.removeAllListeners("tab-new"),i.ipcMain.removeAllListeners("tab-reorder"),i.ipcMain.removeAllListeners("tab-back-to-game"),this.tabWindow&&!this.tabWindow.isDestroyed()&&(this.tabWindow.contentView.removeChildView(this.containerView),this.tabWindow.close(),this.tabWindow=null),this.mode==="same")try{this.mainWin.contentView.removeChildView(this.containerView)}catch{}}destroyAllTabs(){this.tabs.length>0&&this.isRememberEnabled()&&(this.saveTabs(this.tabs.map(e=>e.url)),this.restoredTabs=!1);for(const e of this.tabs)this.stopTitleWatcher(e.id),this.activeTabId===e.id&&this.containerView.removeChildView(e.view),e.view.webContents.isDestroyed()||e.view.webContents.close();this.tabs=[],this.activeTabId=null,this.broadcastTabState()}updateLayout(){let e;if(this.mode==="same"){const[t,A]=this.mainWin.getContentSize();e={width:t,height:A},this.containerView.setBounds({x:0,y:0,width:t,height:A})}else if(this.tabWindow&&!this.tabWindow.isDestroyed()){const[t,A]=this.tabWindow.getContentSize();e={width:t,height:A},this.containerView.setBounds({x:0,y:0,width:t,height:A})}else return;if(this.tabBarView.setBounds({x:0,y:0,width:e.width,height:oe}),this.activeTabId!==null){const t=this.tabs.find(A=>A.id===this.activeTabId);t&&t.view.setBounds({x:0,y:oe,width:e.width,height:e.height-oe})}}updateTabInfo(e,t){const A=this.tabs.find(o=>o.id===e);A&&(t.title!==void 0&&(A.title=t.title),t.url!==void 0&&(A.url=t.url),t.loading!==void 0&&(A.loading=t.loading),this.broadcastTabState())}broadcastTabState(){if(this.tabBarView.webContents.isDestroyed())return;const e=this.tabs.map(t=>({id:t.id,title:t.title,active:t.id===this.activeTabId,loading:t.loading}));this.tabBarView.webContents.send("tabs-update",e)}static GENERIC_TITLES=new Set(["krunker hub","krunker","krunker.io","","hub","social","profile","new tab","loading..."]);isGenericTitle(e){return X.GENERIC_TITLES.has(e.toLowerCase().trim())}startTitleWatcher(e,t){const A=this.titlePolls.get(e);A&&clearInterval(A);let o="",r="";const d=setInterval(()=>{if(t.isDestroyed()){clearInterval(d),this.titlePolls.delete(e);return}t.executeJavaScript(`(function() {
                    var url = window.location.href;
                    var title = '';
                    var ph = document.getElementById('profileHolder');
                    if (ph && ph.style.display === 'block') {
                        var ns = document.getElementById('nameSwitch');
                        if (ns && ns.innerText) title = ns.innerText;
                    }
                    return JSON.stringify({ url: url, dom: title });
                })()`).then(g=>{const{url:u,dom:f}=JSON.parse(g);if(u===o&&f===r)return;o=u,r=f;const c=this.tabs.find(m=>m.id===e);if(c){if(f){c.title!==f?this.updateTabInfo(e,{url:u,title:f}):c.url!==u&&this.updateTabInfo(e,{url:u});return}c.url!==u&&this.updateTabInfo(e,{url:u,title:this.titleFromUrl(u)})}}).catch(()=>{})},1e3);this.titlePolls.set(e,d)}stopTitleWatcher(e){const t=this.titlePolls.get(e);t&&(clearInterval(t),this.titlePolls.delete(e))}titleFromUrl(e){try{const t=new URL(e),A=t.searchParams.get("p"),o=t.searchParams.get("q");if(o)return o;if(A)return{profile:"Profile",leaders:"Leaderboard",games:"Games",clans:"Clans",skins:"Skins",mods:"Mods",maps:"Maps",editor:"Editor",market:"Market",itemsales:"Market Item",inventory:"Inventory",settings:"Settings",feed:"Hub"}[A]||A.charAt(0).toUpperCase()+A.slice(1);const r=t.pathname.replace(/\.html$/,"").replace(/^\//,"");return r==="social"?"Hub":r?r.charAt(0).toUpperCase()+r.slice(1):"New Tab"}catch{return"New Tab"}}}const xt="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qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+5JkQI/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";let Y=null;const Ft="wss://gamefrontend.svc.krunker.io/v1/matchmaking/queue",vt={sandstorm_v3:{number:2,image:"https://assets.krunker.io/img/maps/map_2.png"},undergrowth:{number:4,image:"https://assets.krunker.io/img/maps/map_4.png"},industry:{number:11,image:"https://assets.krunker.io/img/maps/map_11.png"},site:{number:14,image:"https://assets.krunker.io/img/maps/map_14.png"},bureau:{number:17,image:"https://assets.krunker.io/img/maps/map_17.png"},burg_new:{number:0,image:"https://assets.krunker.io/img/maps/map_0.png"},eterno_sim:{number:39,image:"https://assets.krunker.io/img/maps/map_39.png"}},Ge={na:"North America",eu:"Europe",as:"Asia"},Yt=`
* { user-select: none; margin: 0; padding: 0; box-sizing: border-box; }
body {
  font-family: "Trebuchet MS", sans-serif;
  background: #0d0d0d;
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #e0e0e0;
  overflow: hidden;
}
.queuer-container {
  position: relative;
  background: #1a1a1a;
  padding: 40px 52px;
  max-width: 1000px;
  width: 90vw;
  border: 2px solid #2a2a2a;
  border-top: 3px solid #06b6d4;
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.7);
  border-radius: 4px;
}
.main-content { display: flex; align-items: center; gap: 56px; }
.left-section { flex: 1; display: flex; flex-direction: column; gap: 24px; }
.status-area {
  display: flex; align-items: center; gap: 14px;
  position: relative; padding-left: 18px;
}
.status-area::before {
  content: ""; position: absolute; left: 0;
  width: 8px; height: 8px; background: #666;
  border-radius: 50%; transition: background 0.3s ease;
}
.status-area.active::before {
  background: #06b6d4;
  box-shadow: 0 0 12px rgba(6, 182, 212, 0.6);
}
#queueStatus {
  font-size: 14px; font-weight: 600; color: #666;
  text-transform: uppercase; letter-spacing: 1px;
  transition: color 0.3s ease;
}
#queueStatus.active { color: #06b6d4; }
.timer-display {
  font-size: 52px; font-weight: 700; color: #fff;
  font-variant-numeric: tabular-nums; letter-spacing: 0.5px;
  padding: 12px 16px; background: #222;
  border-left: 3px solid #06b6d4; border-radius: 2px;
}
.region-controls { display: flex; gap: 12px; }
.region-option { position: relative; }
.region-option input { display: none; }
.region-option label {
  display: block; padding: 12px 24px; background: #222;
  border: 2px solid #2d2d2d; border-radius: 4px;
  color: #888; font-size: 16px; font-weight: 600;
  text-transform: uppercase; letter-spacing: 0.5px;
  cursor: pointer; transition: all 0.2s ease;
}
.region-option label:hover { background: #2a2a2a; border-color: #3a3a3a; }
.region-option input:checked + label {
  background: rgba(6, 182, 212, 0.1);
  border-color: #06b6d4; color: #06b6d4;
}
.divider { width: 1px; height: 120px; background: #2a2a2a; }
.right-section { display: flex; flex-direction: column; gap: 14px; }
.btn {
  padding: 16px 42px; border: 2px solid transparent;
  font-size: 20px; font-weight: 600; cursor: pointer;
  transition: all 0.2s ease; font-family: "Trebuchet MS", sans-serif;
  text-transform: uppercase; letter-spacing: 1px; border-radius: 4px;
}
.btn:disabled { opacity: 0.4; cursor: not-allowed; }
.btn-secondary { background: #222; color: #999; border-color: #2a2a2a; }
.btn-secondary:hover:not(:disabled) { background: #2a2a2a; border-color: #3a3a3a; }
.btn-primary { background: #06b6d4; color: #fff; border-color: #06b6d4; }
.btn-primary:hover:not(:disabled) { background: #0ea5ca; border-color: #0ea5ca; }
.btn-primary:active:not(:disabled) { transform: scale(0.98); }
.btn-primary.in-queue { background: #222; border-color: #06b6d4; color: #06b6d4; }
.btn-primary.in-queue:hover:not(:disabled) { background: rgba(6, 182, 212, 0.1); }
.overlay {
  position: fixed; top: 0; left: 0; width: 100%; height: 100%;
  background: rgba(0, 0, 0, 0.9); display: flex;
  align-items: center; justify-content: center;
  opacity: 0; visibility: hidden; transition: all 0.3s ease; z-index: 1000;
}
.overlay.active { opacity: 1; visibility: visible; }
.popup {
  background: #1a1a1a; border: 2px solid #2a2a2a;
  border-top: 3px solid #06b6d4; max-width: 560px; width: 90vw;
  box-shadow: 0 12px 48px rgba(0, 0, 0, 0.8);
  text-align: center; transform: scale(0.95);
  transition: transform 0.3s ease; border-radius: 4px;
}
.overlay.active .popup { transform: scale(1); }
.popup h2 {
  margin-top: 12px; font-size: 32px; font-weight: 700;
  color: #06b6d4; text-transform: uppercase; letter-spacing: 1.5px;
}
.popup-content { margin: 20px 0; }
.popup-content p {
  font-size: 15px; color: #888; margin-bottom: 12px;
  text-transform: uppercase; letter-spacing: 0.5px; font-weight: 600;
}
.region-found {
  font-size: 18px; font-weight: 700; color: #fff;
  text-transform: uppercase; letter-spacing: 1px;
  display: inline-block; padding: 12px 24px;
  background: rgba(6, 182, 212, 0.15);
  border: 2px solid #06b6d4; border-radius: 4px;
}
.countdown-large {
  font-size: 48px; font-weight: 700; color: #06b6d4;
  margin: 16px 0; font-variant-numeric: tabular-nums; line-height: 1;
}
#matchFoundMessage {
  margin-top: 12px; font-size: 20px; color: #fff;
  text-align: center; width: 400px; margin-left: auto; margin-right: auto;
}
#closeButton {
  position: absolute; right: 0; top: 0;
  margin: 10px 20px 0 0; font-size: 20px; cursor: pointer;
}
`;function Kt(){const a=[];for(const[e,t]of Object.entries(vt))a.push(`${JSON.stringify(e)}: { number: ${t.number}, image: ${JSON.stringify(t.image)} }`);return`{ ${a.join(", ")} }`}function Ut(){return JSON.stringify(Ge)}function Nt(){return Object.entries(Ge).map(([a,e])=>{const t=a==="as"?"asia":a;return`<div class="region-option"><input type="checkbox" id="${t}" value="${a}"><label for="${t}">${e==="North America"?"NA":e==="Europe"?"EU":"Asia"}</label></div>`}).join(`
`)}function Rt(a,e,t){return`
let isQueued = false;
let queueStartTime = null;
let queueInterval = null;
let queueConnection = null;
let countdownInterval = null;
let isConnecting = false;
let audioContext = null;
let notificationBuffer = null;
let currentSource = null;
let audioInitialized = false;
const selectedMaps = new Set();

const WS_URL = ${JSON.stringify(Ft)};
const INIT_TOKEN = ${JSON.stringify(a)};
const INIT_REGION = ${JSON.stringify(e)};
const INIT_ALL_REGIONS = ${JSON.stringify(t)};
const maps = ${Kt()};
const regions = ${Ut()};

const queueStatus = document.getElementById('queueStatus');
const statusArea = document.getElementById('statusArea');
const queueTimerDisplay = document.getElementById('queueTimerDisplay');
const regionCheckboxes = document.getElementById('regionCheckboxes');
const matchPopupOverlay = document.getElementById('matchPopupOverlay');
const countdownTimer = document.getElementById('countDownTimer');
const foundRegion = document.getElementById('foundRegion');
const queueButton = document.getElementById('queueButton');
const closeButton = document.getElementById('closeButton');

const base64String = ${JSON.stringify(xt)};

function saveSettings() {
    const selectedRegions = Array.from(document.querySelectorAll('#regionCheckboxes input:checked')).map(el => el.value);
    localStorage.setItem('queue_selectedRegions', JSON.stringify(selectedRegions));
}

function loadSettings() {
    const savedRegions = localStorage.getItem('queue_selectedRegions');
    if (savedRegions) {
        for (const regionId of JSON.parse(savedRegions)) {
            const checkbox = document.getElementById(regionId === 'as' ? 'asia' : regionId);
            if (checkbox) checkbox.checked = true;
        }
    } else if (INIT_REGION) {
        const checkbox = document.getElementById(INIT_REGION === 'as' ? 'asia' : INIT_REGION);
        if (checkbox) checkbox.checked = true;
        if (INIT_ALL_REGIONS) {
            for (const el of document.querySelectorAll('#regionCheckboxes input')) el.checked = true;
        }
    }
}

const base64ToArrayBuffer = (b64) => {
    const bin = atob(b64);
    const bytes = new Uint8Array(bin.length);
    for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);
    return bytes.buffer;
};

async function initializeAudio() {
    audioContext = new AudioContext();
    if (audioContext.state === 'suspended') await audioContext.resume();
    const arrayBuffer = base64ToArrayBuffer(base64String);
    notificationBuffer = await audioContext.decodeAudioData(arrayBuffer);
    audioInitialized = true;
}

function playNotificationSound() {
    if (!notificationBuffer || !audioContext) return;
    try {
        const source = audioContext.createBufferSource();
        source.buffer = notificationBuffer;
        source.connect(audioContext.destination);
        source.start(0);
        currentSource = source;
    } catch (e) { console.error('Audio play error:', e); }
}

function stopNotificationSound() {
    if (currentSource) {
        try { currentSource.stop(); currentSource.disconnect(); } catch {}
        currentSource = null;
    }
}

function formatTime(seconds) {
    const h = String(Math.floor(seconds / 3600)).padStart(2, '0');
    const m = String(Math.floor((seconds % 3600) / 60)).padStart(2, '0');
    const s = String(Math.floor(seconds % 60)).padStart(2, '0');
    return h + ':' + m + ':' + s;
}

function updateCooldownTimer(ms) {
    const endTime = Date.now() + ms;
    function updateDisplay() {
        const remaining = Math.ceil((endTime - Date.now()) / 1000);
        if (remaining <= 0) {
            queueStatus.textContent = 'Ready';
            queueStatus.classList.remove('active');
            statusArea.classList.remove('active');
            queueButton.disabled = false;
            return;
        }
        queueStatus.textContent = 'Cooldown: ' + formatTime(remaining);
        queueButton.disabled = true;
        setTimeout(updateDisplay, 1000);
    }
    updateDisplay();
}

function updateQueueTimer() {
    if (queueStartTime) {
        const elapsed = Math.floor((Date.now() - queueStartTime) / 1000);
        queueTimerDisplay.textContent = formatTime(elapsed);
    }
}

function startQueue() {
    const selectedRegions = Array.from(document.querySelectorAll('#regionCheckboxes input:checked')).map(el => el.value);

    if (selectedRegions.length === 0) {
        queueStatus.textContent = 'Select at least one region';
        queueButton.disabled = false;
        isConnecting = false;
        return;
    }
    if (selectedMaps.size === 0) {
        queueStatus.textContent = 'Select at least one map';
        queueButton.disabled = false;
        isConnecting = false;
        return;
    }

    const wsUrl = WS_URL + '?token=' + INIT_TOKEN + '&maps=' + Array.from(selectedMaps).join(',') + '&regions=' + selectedRegions.join(',');

    try {
        queueConnection = new WebSocket(wsUrl);
    } catch (error) {
        console.error('WebSocket creation error:', error);
        queueStatus.textContent = 'Connection failed';
        queueButton.disabled = false;
        isConnecting = false;
        return;
    }

    queueConnection.onerror = (error) => {
        console.error('queueConnection error:', error);
        queueStatus.textContent = 'Connection error';
        queueStatus.classList.remove('active');
        statusArea.classList.remove('active');
        isQueued = false;
        isConnecting = false;
        queueButton.disabled = false;
    };

    queueConnection.onopen = () => {
        isQueued = true;
        isConnecting = false;
        queueStartTime = Date.now();
        queueButton.textContent = 'Leave Queue';
        queueButton.classList.add('in-queue');
        queueStatus.textContent = 'In queue';
        queueStatus.classList.add('active');
        statusArea.classList.add('active');
        updateQueueTimer();
        queueInterval = setInterval(updateQueueTimer, 1000);
        queueButton.disabled = false;
    };

    queueConnection.onmessage = (event) => {
        const data = JSON.parse(event.data);
        switch (data.type) {
            case 'QUEUE_STATUS':
                if (data.payload.status === 'MATCHED')
                    matchFound(data.payload.assignment.extensions.map.trim(), data.payload.assignment.extensions.region);
                break;
            case 'ERROR':
                if (data.payload.code === 'COOLDOWN') {
                    queueConnection.close();
                    isQueued = false;
                    isConnecting = false;
                    queueButton.disabled = false;
                    updateCooldownTimer(data.payload.payload.cooldown);
                }
                break;
            case 'INTERNAL_ERROR':
                queueConnection.close();
                isQueued = false;
                isConnecting = false;
                queueButton.disabled = false;
                break;
        }
    };

    queueConnection.onclose = () => {
        isQueued = false;
        isConnecting = false;
        clearInterval(queueInterval);
        queueButton.textContent = 'Start Queue';
        queueButton.classList.remove('in-queue');
        queueStatus.textContent = 'Ready';
        queueStatus.classList.remove('active');
        statusArea.classList.remove('active');
        queueTimerDisplay.textContent = '00:00:00';
        queueButton.disabled = false;
    };
}

function matchFound(map, region) {
    playNotificationSound();
    matchPopupOverlay.classList.add('active');
    region = region.slice(2);
    const regionName = regions[region] || region;
    let foundMapName = 'unknown';
    for (const [mapName, mapData] of Object.entries(maps)) {
        if (mapData.number === parseInt(map, 10)) { foundMapName = mapName; break; }
    }
    foundRegion.textContent = regionName + ', ' + foundMapName;

    const duration = 60;
    const startTime = Date.now();
    countdownInterval = setInterval(() => {
        const elapsed = Math.floor((Date.now() - startTime) / 1000);
        const remaining = Math.max(0, duration - elapsed);
        countdownTimer.textContent = formatTime(remaining);
        if (remaining <= 0) {
            clearInterval(countdownInterval);
            matchPopupOverlay.classList.remove('active');
        }
    }, 1000);

    isQueued = false;
    isConnecting = false;
    clearInterval(queueInterval);
    queueButton.textContent = 'Start Queue';
    queueButton.classList.remove('in-queue');
    queueStatus.textContent = 'Ready';
    queueStatus.classList.remove('active');
    statusArea.classList.remove('active');
    queueTimerDisplay.textContent = '00:00:00';
    queueButton.disabled = false;
}

// Queue button
queueButton.onclick = async () => {
    if (isConnecting) return;
    queueButton.disabled = true;
    isConnecting = true;
    if (isQueued) {
        queueConnection.close();
    } else {
        if (!audioInitialized) await initializeAudio();
        startQueue();
    }
};

// Close match popup
closeButton.onclick = () => {
    matchPopupOverlay.classList.remove('active');
    stopNotificationSound();
    if (countdownInterval) clearInterval(countdownInterval);
};

// Region checkbox changes
for (const sel of regionCheckboxes.querySelectorAll('input')) {
    sel.onclick = () => {
        if (isQueued && queueConnection) queueConnection.close();
        saveSettings();
    };
}

// Init — select all maps unconditionally (ranked doesn't allow map choice)
for (const data of Object.values(maps)) selectedMaps.add(data.number);
loadSettings();
`}function Lt(a,e,t){return`<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<title>Ranked Queue</title>
<style>${Yt}</style>
</head>
<body>
<div class="queuer-container">
  <div class="main-content">
    <div class="left-section">
      <div class="status-area" id="statusArea">
        <span id="queueStatus">Ready</span>
      </div>
      <div class="timer-display" id="queueTimerDisplay">00:00:00</div>
      <div class="region-controls" id="regionCheckboxes">
        ${Nt()}
      </div>
    </div>
    <div class="divider"></div>
    <div class="right-section">
      <button type="button" class="btn btn-primary" id="queueButton">Start Queue</button>
    </div>
  </div>
</div>
<div class="overlay" id="matchPopupOverlay">
  <div class="popup">
    <h2>Match Found</h2>
    <div class="popup-content">
      <div id="closeButton">X</div>
      <div class="region-found" id="foundRegion">Region: </div>
      <div id="matchFoundMessage">open the client and rejoin the game from the ranked menu</div>
      <div class="countdown-large" id="countDownTimer">00:00:60</div>
    </div>
  </div>
</div>
<script>${Rt(a,e,t)}<\/script>
</body>
</html>`}function Ht(a,e,t){if(Y&&!Y.isDestroyed()){Y.focus();return}const A=new i.BrowserWindow({width:850,height:350,resizable:!1,autoHideMenuBar:!0,backgroundColor:"#0d0d0d",title:"Ranked Queue",webPreferences:{nodeIntegration:!1,contextIsolation:!0,sandbox:!0}});A.removeMenu(),Y=A,A.on("closed",()=>{Y=null});const o=Lt(a,e,t);A.loadURL("data:text/html;charset=utf-8,"+encodeURIComponent(o))}const Ve=require("../../package.json").version,Pt={"us-ca-sv":"SV","jb-hnd":"TOK","de-fra":"FRA","as-mb":"MBI","au-syd":"SYD",sgp:"SIN","us-tx":"DAL","me-bhn":"BHN",brz:"BRZ","us-nj":"NY"};let R={},De=0;function ke(a){return new Promise(e=>{const A=process.platform==="win32"?["-n","1","-w","1500",a]:["-c","1","-W","2",a];J.execFile("ping",A,{timeout:3e3},(o,r)=>{if(o){e(-1);return}const d=r.match(/time[=<]([\d.]+)\s*ms/i);e(d?Math.round(parseFloat(d[1])):-1)})})}const Me=Ne(),Ot={removeUselessFeatures:!0,gpuRasterizing:!1,helpfulFlags:!0,increaseLimits:!1,lowLatency:!1,experimentalFlags:!1},Jt={...Ot,...w.get("advanced")},Wt={fpsUnlocked:!0,...w.get("performance")};Re(Me,Jt,Wt);i.app.setAppUserModelId("com.krunkercivilian.client");Pe();const Ie=["*://*.pollfish.com/*","*://www.paypalobjects.com/*","*://fran-cdn.frvr.com/*","*://c.amazon-adsystem.com/*","*://cdn.frvr.com/fran/*","*://cookiepro.com/*","*://*.cookiepro.com/*","*://www.googletagmanager.com/*","*://*.doubleclick.net/*","*://storage.googleapis.com/pollfish_production/*","*://coeus.frvr.com/*","*://apis.google.com/js/platform.js","*://imasdk.googleapis.com/*"],jt=`
.endAHolder,
#aHider,
#adCon,
#rightABox,
#aContainer,
#topRightAdHolder,
div#aContainer,
#braveWarning,
#topRightAdHolder {
  display: none !important;
}`,Xt=`
(function dismissConsent() {
  let attempts = 0;
  const timer = setInterval(() => {
    attempts++;
    const btn = document.querySelector('.fc-cta-consent, [aria-label="Consent"], .css-47sehv');
    if (btn) { btn.click(); clearInterval(timer); }
    if (attempts > 30) clearInterval(timer);
  }, 500);
})();`,zt=`
document.addEventListener('keydown', function(e) {
  if (e.key === 'Escape' && document.pointerLockElement) {
    document.exitPointerLock();
  }
}, true);`;function Qe(a){try{const e=new URL(a);(e.protocol==="https:"||e.protocol==="http:")&&i.shell.openExternal(a)}catch{}}function y(a,e){return e?a.key===e.key&&a.control===e.ctrl&&a.shift===e.shift&&a.alt===e.alt:!1}let O=null;function Zt(){return O||(O={...be,...w.get("keybinds")}),O}let ne=null;function F(a){ne&&clearTimeout(ne),ne=setTimeout(()=>{if(a.isDestroyed())return;const e=a.getBounds();w.set("window",{width:e.width,height:e.height,x:e.x,y:e.y,maximized:a.isMaximized(),fullscreen:a.isFullScreen()})},1e3)}i.app.whenReady().then(async()=>{p.log("[KCC] App ready"),p.log("[KCC] Minor update test — asar swap successful");const a=!!process.env.PORTABLE_EXECUTABLE_DIR,e=!!process.env.APPIMAGE,t=!i.app.isPackaged,A=process.platform==="win32"&&!a,o=!a&&!e;if(t||!A&&!o)p.log("[KCC] Skipping auto-update");else{const r=q.join(q.dirname(i.app.getPath("exe")),"resources"),d=q.join(r,"app-pending.asar");if(k.existsSync(d))try{k.unlinkSync(d)}catch{}try{p.log("[KCC] Checking for updates...");const g=await ht(Ve);if(g){p.log(`[KCC] Update available: v${g.version} (${g.updateType})`);const{window:u,sendProgress:f}=Ct();let c=!1;if(u.on("closed",()=>{c=!0}),g.updateType==="minor"&&o){f(`Patch available (v${g.version})`,0);const m=q.join(r,"app-pending.asar");try{if(await ue(g.downloadUrl,m,B=>{!c&&!u.isDestroyed()&&f(`Downloading patch... ${B}%`,B)},g.sha256||void 0),!c){f("Applying patch...",100),mt(m);return}}catch(B){if(p.error("[KCC] Patch download failed:",B),k.existsSync(m))try{k.unlinkSync(m)}catch{}u.isDestroyed()||u.close()}}else if(g.updateType==="major"&&A){f(`Update available (v${g.version})`,0);const m=q.join(i.app.getPath("temp"),"kcc-update");C.existsSync(m)||C.mkdirSync(m,{recursive:!0});const B=q.join(m,`KCC-${g.version}-Setup.exe`);try{if(await ue(g.downloadUrl,B,T=>{!c&&!u.isDestroyed()&&f(`Downloading update... ${T}%`,T)},g.sha256||void 0),!c){f("Installing update...",100),ut(B);return}}catch(T){p.error("[KCC] Update download failed:",T),u.isDestroyed()||u.close()}}else p.log("[KCC] Update available but cannot auto-install on this platform"),u.isDestroyed()||u.close()}else p.log("[KCC] No updates available")}catch(g){p.error("[KCC] Update check failed:",g)}}await _t()});async function _t(){p.log("[KCC] Starting initialization");const a=i.session.fromPartition("persist:krunker"),e=a.getUserAgent();a.setUserAgent(e.replace(/\s*krunker-civilian-client\/\S+/i,"")),Oe(a);const t=w.get("swapper"),A=t.path||q.join(i.app.getPath("userData"),"Krunker Civilian Client","swapper");for(const s of["themes","backgrounds"]){const n=q.join(A,s);C.existsSync(n)||C.mkdirSync(n,{recursive:!0})}const o=t.enabled?new Je(A):null;p.log(`[KCC] Resource swapper: ${o?"enabled":"disabled"} (${A})`);const r=w.get("userscripts")||{enabled:!0,path:""},d=r.path||q.join(i.app.getPath("userData"),"Krunker Civilian Client"),g=r.enabled?new We(d):null;p.log(`[KCC] Userscripts: ${g?"enabled":"disabled"} (${d})`);const u=o?[...Ie,"*://*.krunker.io/*"]:[...Ie];a.webRequest.onBeforeRequest({urls:u},(s,n)=>{if(o){const l=o.getRedirect(s.url);if(l)return n({redirectURL:l})}try{if(new URL(s.url).hostname.endsWith("krunker.io"))return n({})}catch{}n({cancel:!0})}),o&&o.waitForReady().then(()=>{p.log(`[KCC] Swapper ready: ${o.patterns.length} pattern(s)`)}),o&&a.webRequest.onHeadersReceived(({responseHeaders:s},n)=>{if(!s)return n({});for(const l in s){const h=l.toLowerCase();if(h==="access-control-allow-credentials"&&s[l][0]==="true")return n({responseHeaders:s});if(h==="access-control-allow-origin"){delete s[l];break}}return n({responseHeaders:{...s,"access-control-allow-origin":["*"]}})});const f=w.get("window"),c=new i.BrowserWindow({width:f.width,height:f.height,x:f.x,y:f.y,frame:!0,backgroundColor:"#000000",webPreferences:{preload:q.join(__dirname,"..","preload","index.js"),session:a,contextIsolation:!1,nodeIntegration:!1,sandbox:!0,spellcheck:!1,backgroundThrottling:!1}});f.fullscreen?c.setFullScreen(!0):f.maximized&&c.maximize(),i.Menu.setApplicationMenu(null);let m=null;if((w.get("discord")||{enabled:!1}).enabled&&(m=new bt,m.connect(),p.log("[KCC] Discord Rich Presence enabled")),process.platform==="win32"){const s={High:-14,"Above Normal":-7,"Below Normal":7,Low:19},n=w.get("performance")?.processPriority||"Normal",l=s[n];if(l!==void 0){try{ge.setPriority(process.pid,l)}catch{}setInterval(()=>{for(const h of i.app.getAppMetrics())if(h.pid!==process.pid)try{ge.setPriority(h.pid,l)}catch{}},1e3),p.log(`[KCC] Process priority set to ${n}`)}}const B=new WeakSet;function T(s,n){const l=Math.max(1,Math.min(3,n));try{B.has(s)||(s.debugger.attach("1.3"),B.add(s)),s.debugger.sendCommand("Emulation.setCPUThrottlingRate",{rate:l})}catch{}}let Q=!1;i.ipcMain.on("keybind-capture",(s,n)=>{Q=n}),c.webContents.on("before-input-event",(s,n)=>{if(n.type!=="keyDown"||Q)return;const l=Zt();if(y(n,l.reload))c.reload(),s.preventDefault();else if(y(n,l.newMatch)){const h=w.get("matchmaker");h.enabled?c.webContents.send("matchmaker-find",{...h,cancelKey:l.matchmakerCancel}):c.loadURL("https://krunker.io"),s.preventDefault()}else if(y(n,l.joinFromClipboard)){const h=i.clipboard.readText();try{const b=new URL(h);b.protocol==="https:"&&b.hostname.endsWith("krunker.io")&&c.loadURL(h)}catch{}s.preventDefault()}else if(y(n,l.copyGameLink))i.clipboard.writeText(c.webContents.getURL()),s.preventDefault();else if(y(n,l.devTools))c.webContents.toggleDevTools(),s.preventDefault();else if(y(n,l.matchmaker)){const h=w.get("matchmaker");h.enabled?c.webContents.send("matchmaker-find",{...h,cancelKey:l.matchmakerCancel}):c.loadURL("https://krunker.io"),s.preventDefault()}else y(n,l.fullscreenToggle)?(c.setFullScreen(!c.isFullScreen()),s.preventDefault()):n.key==="t"&&n.control&&!n.shift&&!n.alt?(V.openTab("https://krunker.io/social.html"),s.preventDefault()):n.key==="T"&&n.control&&n.shift&&!n.alt&&(V.reopenTab(),s.preventDefault())}),c.on("resize",()=>F(c)),c.on("move",()=>F(c)),c.on("maximize",()=>F(c)),c.on("unmaximize",()=>F(c)),c.on("enter-full-screen",()=>F(c)),c.on("leave-full-screen",()=>F(c));const D=["/",""];function G(s){try{const n=new URL(s);return n.hostname.includes("krunker.io")?D.includes(n.pathname):!1}catch{return!1}}const ye={lastServer:"",socialTabBehaviour:"New Window"};let U=null;function xe(){return U||(U={...ye,...w.get("game")}),U}const ce=q.join(__dirname,"..","preload","index.js");let N=xe().socialTabBehaviour==="Same Window"?"same":"new",le=[],V=new X(c,a,ce,N,G,()=>w.get("tabWindow"),s=>w.set("tabWindow",s),()=>le,s=>{le=s},()=>w.get("game.rememberTabs")??!1);c.webContents.on("will-navigate",(s,n)=>{try{const l=new URL(n);if(l.protocol!=="https:"&&l.protocol!=="http:"){s.preventDefault();return}}catch{s.preventDefault();return}n.includes("krunker.io")&&!G(n)&&(s.preventDefault(),V.openTab(n))}),c.webContents.setWindowOpenHandler(({url:s})=>(s.includes("krunker.io")?G(s)?c.loadURL(s):setImmediate(()=>V.openTab(s)):setImmediate(()=>Qe(s)),{action:"deny"})),c.webContents.on("context-menu",(s,n)=>{if(!n.linkURL)return;const l=[];n.linkURL.includes("krunker.io")&&!G(n.linkURL)&&l.push({label:"Open in New Tab",click:()=>V.openTab(n.linkURL)}),l.push({label:"Copy Link",click:()=>i.clipboard.writeText(n.linkURL)}),n.linkURL.includes("krunker.io")||l.push({label:"Open in Browser",click:()=>Qe(n.linkURL)}),l.length&&i.Menu.buildFromTemplate(l).popup()}),c.webContents.on("did-finish-load",()=>{p.log(`[KCC] Page loaded: ${c.webContents.getURL()}`),o&&o.rescan().catch(()=>{});const s=[c.webContents.insertCSS(jt),c.webContents.insertCSS(Te)],n=w.get("ui"),l=n?.cssTheme||"disabled",h=we(l,A);if(p.log(`[KCC] CSS theme: id=${l}, css=${h?h.length+" chars":"none"}`),h){const I=Buffer.from(h).toString("base64");c.webContents.executeJavaScript(`(() => {
        const s = document.createElement('style');
        s.id = 'kcc-user-theme';
        s.textContent = atob('${I}');
        document.head.appendChild(s);
      })()`).catch(S=>p.warn("[KCC] Theme inject failed:",S))}const b=Ce(n?.loadingTheme||"disabled",n?.backgroundUrl||"",A);b&&s.push(c.webContents.insertCSS(b)),Promise.all(s).catch(()=>{});const E=w.get("performance");T(c.webContents,E?.cpuThrottleMenu??1.5),c.webContents.executeJavaScript(zt).catch(I=>p.warn("[KCC] Pointerlock fix inject failed:",I)),c.webContents.executeJavaScript(Xt).catch(I=>p.warn("[KCC] Consent dismiss inject failed:",I)),c.webContents.send("main_did-finish-load")});const z=new Set(["window","performance","game","swapper","matchmaker","keybinds","userscripts","ui","discord","translator","advanced","accounts","tabWindow"]);i.ipcMain.handle("get-version",()=>Ve),i.ipcMain.handle("get-platform",()=>Me),i.ipcMain.handle("get-config",(s,n)=>{if(z.has(n))return w.get(n)}),i.ipcMain.handle("get-all-config",(s,n)=>{const l={};for(const h of n)z.has(h)&&(l[h]=w.get(h));return l});let Z=null;const _=new Map;i.ipcMain.handle("set-config",(s,n,l)=>{if(z.has(n)){if(n==="keybinds"){w.set(n,l),O=null;return}if(n==="game"){U=null;const h=l;if(h?.socialTabBehaviour){const b=h.socialTabBehaviour==="Same Window"?"same":"new";b!==N&&(V.destroyAll(),N=b,V=new X(c,a,ce,N,G,()=>w.get("tabWindow"),E=>w.set("tabWindow",E)))}}_.set(n,l),Z||(Z=setTimeout(()=>{for(const[h,b]of _)w.set(h,b);_.clear(),Z=null},300))}}),i.ipcMain.handle("window-minimize",()=>c.minimize()),i.ipcMain.handle("window-maximize",()=>{c.isMaximized()?c.unmaximize():c.maximize()}),i.ipcMain.handle("window-close",()=>c.close()),i.ipcMain.handle("window-is-maximized",()=>c.isMaximized()),i.ipcMain.handle("toggle-devtools",()=>c.webContents.toggleDevTools()),i.ipcMain.handle("inject-game-click",()=>{const[s,n]=c.getContentSize(),l=Math.round(s/2),h=Math.round(n/2);c.webContents.sendInputEvent({type:"mouseDown",x:l,y:h,button:"left",clickCount:1}),c.webContents.sendInputEvent({type:"mouseUp",x:l,y:h,button:"left",clickCount:1})}),i.ipcMain.handle("get-swap-dir",()=>A),i.ipcMain.handle("open-swap-folder",()=>i.shell.openPath(A)),i.ipcMain.handle("open-themes-folder",()=>i.shell.openPath(q.join(A,"themes"))),i.ipcMain.handle("open-backgrounds-folder",()=>i.shell.openPath(q.join(A,"backgrounds"))),i.ipcMain.handle("ping-regions",async()=>{if(Object.keys(R).length>0&&Date.now()-De<6e4)return R;try{const s=await new Promise((E,I)=>{v.get("https://matchmaker.krunker.io/ping-list?hostname=krunker.io",S=>{let M="";S.on("data",x=>{M+=x}),S.on("end",()=>E(M)),S.on("error",I)}).on("error",I)}),n=JSON.parse(s),l={};async function h(E){const I=await ke(E);if(I>=0)return I;const S=await ke(E);return S>=0?S:-1}const b=Object.entries(n).map(async([E,I])=>{const S=Pt[E]??E,M=I.split(":")[0],x=await h(M);x>=0&&(l[S]=x)});return await Promise.allSettled(b),R=l,De=Date.now(),l}catch(s){return p.error("[KCC] Ping regions error:",s),R}}),i.ipcMain.on("open-ranked-queue",(s,n,l,h)=>{Ht(n,l,h)}),i.ipcMain.on("discord-update",(s,n)=>{m?.setActivity(n)}),i.ipcMain.on("verbose-log",(s,n,...l)=>{n==="error"?p.error(...l):n==="warn"?p.warn(...l):p.log(...l)}),i.ipcMain.on("throttle-state",(s,n)=>{const l=w.get("performance"),h=n==="game"?l?.cpuThrottleGame??1:l?.cpuThrottleMenu??1.5;T(c.webContents,h)}),i.ipcMain.handle("list-themes",()=>St(A)),i.ipcMain.handle("get-theme-css",(s,n)=>we(n,A)),i.ipcMain.handle("list-loading-themes",()=>Tt(A)),i.ipcMain.handle("get-loading-screen-css",(s,n,l)=>Ce(n,l,A)),i.ipcMain.handle("changelog-fetch",async(s,n)=>{const l=n.startsWith("v")?n:`v${n}`;try{const h=await new Promise((E,I)=>{v.get(`https://api.github.com/repos/bigjakk/Krunker-Civilian-Client/releases/tags/${l}`,{headers:{"User-Agent":"KCC"}},S=>{let M="";S.on("data",x=>{M+=x}),S.on("end",()=>E(M)),S.on("error",I)}).on("error",I)});return JSON.parse(h).body||""}catch{return""}}),i.ipcMain.handle("userscripts-get-dir",()=>g?g.dir:""),i.ipcMain.handle("userscripts-open-folder",()=>{g&&i.shell.openPath(g.dir)}),i.ipcMain.handle("userscripts-scan",async()=>{if(!g)return{scripts:[],tracker:{}};const s=await g.scanScripts(),n=await g.loadTracker(s);return{scripts:s,tracker:n}}),i.ipcMain.handle("userscripts-set-tracker",(s,n)=>{g&&g.saveTracker(n)}),i.ipcMain.handle("userscripts-load-prefs",(s,n)=>g?g.loadScriptPrefs(n):{}),i.ipcMain.handle("userscripts-save-prefs",(s,n,l)=>{g&&g.saveScriptPrefs(n,l)}),i.ipcMain.handle("open-electron-log",()=>{i.shell.openPath(ot())}),i.ipcMain.handle("reset-swapper",async()=>{try{const s=await C.promises.readdir(A,{withFileTypes:!0});for(const n of s)await C.promises.rm(q.join(A,n.name),{recursive:!0,force:!0});return!0}catch(s){return p.error("[KCC] Reset swapper failed:",s),!1}}),i.ipcMain.handle("restart-client",()=>{i.app.relaunch(),i.app.quit()}),i.ipcMain.handle("reset-options",()=>{w.clear(),i.app.relaunch(),i.app.quit()}),i.ipcMain.handle("delete-all-data",async()=>{w.clear();const s=i.app.getPath("userData");try{await C.promises.rm(q.join(s,"logs"),{recursive:!0,force:!0})}catch(n){p.warn("[KCC] Partial data deletion failed (non-fatal):",n)}i.app.relaunch(),i.app.quit()});const $=i.safeStorage.isEncryptionAvailable();$||p.warn("[KCC] safeStorage encryption not available — account passwords will use base64 fallback");function pe(s){return $?i.safeStorage.encryptString(s).toString("base64"):Buffer.from(s).toString("base64")}function de(s){return $?i.safeStorage.decryptString(Buffer.from(s,"base64")):Buffer.from(s,"base64").toString()}i.ipcMain.handle("alt-list",()=>(w.get("accounts")||[]).map(n=>({label:n.label}))),i.ipcMain.handle("alt-save",(s,n)=>{const l=w.get("accounts")||[],h={label:n.label,username:pe(n.username),password:pe(n.password)};return l.push(h),w.set("accounts",l),{success:!0,index:l.length-1}}),i.ipcMain.handle("alt-get-credentials",(s,n)=>{const l=w.get("accounts")||[];if(n<0||n>=l.length)return null;const h=l[n];try{return{username:de(h.username),password:de(h.password)}}catch(b){return p.error("[KCC] Failed to decrypt account credentials:",b),null}}),i.ipcMain.handle("alt-remove",(s,n)=>{const l=w.get("accounts")||[];return n<0||n>=l.length?{success:!1}:(l.splice(n,1),w.set("accounts",l),{success:!0})}),i.ipcMain.handle("alt-rename",(s,n,l)=>{const h=w.get("accounts")||[];return n<0||n>=h.length?{success:!1}:(h[n].label=l,w.set("accounts",h),{success:!0})}),c.on("close",()=>{c.webContents.setAudioMuted(!0),c.webContents.stop()}),i.app.on("will-quit",()=>{m?.disconnect(),p.log("[KCC] Shutting down"),nt()}),p.log("[KCC] Initialization complete — loading game"),c.loadURL("https://krunker.io")}i.app.on("window-all-closed",()=>{i.app.quit()});
"use strict";const c=require("electron"),St={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function b(e){return e.replace(/[&<>"']/g,n=>St[n])}const Xe="kpc-animationBlock",Et=".death-ui-bottom, .death-ui-bottom-empty { animation: none !important; transition: none !important; }";function Fe(e){let n=document.getElementById(Xe);e?n||(n=document.createElement("style"),n.id=Xe,n.textContent=Et,document.head.appendChild(n)):n&&n.remove()}const Je="kpc-menuTimer",xt=`
#uiBase.onMenu #spectateUI { display: block !important; }
#uiBase.onCompMenu.onMenu #specTimer,
#uiBase.onMenu #specGMessage,
#uiBase.onMenu #spec1,
#uiBase.onMenu #specGameInfo,
#uiBase.onMenu #spec0,
#uiBase.onMenu #specControlHolder,
#uiBase.onMenu #specNames { display: none !important; }
#uiBase.onMenu #spectateHUD {
  box-sizing: border-box; display: flex !important; justify-content: center;
  height: 0.5rem; white-space: nowrap; width: max-content;
  position: fixed; top: calc(50% + 140px);
}
#uiBase.onMenu #spectateHUD #specGMessage { top: 0; }
#uiBase.onMenu #spectateUI > #spectateHUD { z-index: 1; transform: unset; }
#uiBase.onMenu .spectateInfo {
  position: fixed; top: calc(50% + 80px); left: 50%; transform: translate(-50%, -50%);
}
#uiBase.onMenu #spectateUI div .spectateInfo #specTimer {
  background-color: transparent; padding: 25px; font-size: 42px; border-radius: 0.5em;
}
#uiBase.onMenu #specKPDContr { display: none; }
#uiBase.onMenu #spectateUI div#specStats {
  position: absolute; top: calc(50% + 13em); left: 50%; transform: translateX(-50%); z-index: 1;
}
#uiBase.onMenu #spectateUI div#specStats:before {
  content: "Spectating"; position: absolute; bottom: 100%; left: 50%;
  transform: translateX(-50%); font-size: 1.2em; padding-bottom: 0.5em;
}
`;function _e(e){let n=document.getElementById(Je);e?n||(n=document.createElement("style"),n.id=Je,n.textContent=xt,document.head.appendChild(n)):n&&n.remove()}const Lt=["Free for All","Team Deathmatch","Hardpoint","Capture the Flag","Parkour","Hide & Seek","Infected","Race","Last Man Standing","Simon Says","Gun Game","Prop Hunt","Boss Hunt","Classic FFA","Deposit","Stalker","King of the Hill","One in the Chamber","Trade","Kill Confirmed","Defuse","Sharp Shooter","Traitor","Raid","Blitz","Domination","Squad Deathmatch","Kranked FFA","Team Defender","Deposit FFA","Chaos Snipers","Bighead FFA"],Tt=["Free for All","Team Deathmatch","Hardpoint","Capture the Flag","Parkour","Gun Game","Classic FFA","Deposit","Kill Confirmed","Sharp Shooter","Domination","Kranked FFA","Team Defender","Deposit FFA","Chaos Snipers","Bighead FFA"],Mt=["SV","TOK","FRA","MBI","SYD","SIN","DAL","BHN","BRZ","NY"],st={SV:"Silicon Valley",TOK:"Tokyo",FRA:"Frankfurt",MBI:"Mumbai",SYD:"Sydney",SIN:"Singapore",DAL:"Dallas",BHN:"Bahrain",BRZ:"Brazil",NY:"New York"},It={SkyTemple:"Sky Temple",Krunk_Plaza:"Krunk Plaza",Old_Burg:"Old Burg","Soul Sanctum":"Soul Sanctum","Slide Moonlight":"Slide Moonlight","Eterno Sim":"Eterno Sim"},Rt=["Burg","Littletown","Sandstorm","Subzero","Undergrowth","Freight","Lostworld","Citadel","Oasis","Kanji","Industry","Lumber","Evacuation","Site","SkyTemple","Lagoon","Tropicano","Habitat","Atomic","Old_Burg","Throwback","Clockwork","Bazaar","Erupt","HQ","Lush","Vivo","Slide Moonlight","Eterno Sim"],Bt=4,Ze=2e3,Be=80,At=20,Pt=300,Nt=800;function Ht(e,n){return document.activeElement?.tagName==="INPUT"?!1:n.key===e.key&&n.shiftKey===e.shift&&n.altKey===e.alt&&n.ctrlKey===e.ctrl}const Dt="matchmakerPopupContainer",A=document.createElement("div");A.id=Dt;const it=document.createElement("div");it.id="matchmakerPopupTitle";A.appendChild(it);const ot=document.createElement("div");ot.id="matchmakerPopupDescription";A.appendChild(ot);const $e=document.createElement("div");$e.id="matchmakerPopupOptions";const ee=document.createElement("div");ee.id="matchmakerCancelButton";ee.className="matchmakerPopupButton bigShadowT";ee.textContent="Cancel";ee.setAttribute("onmouseenter","playTick()");ee.addEventListener("click",()=>{const e=window;typeof e.playSelect=="function"&&e.playSelect(),q()});$e.appendChild(ee);A.appendChild($e);const te=document.createElement("div");te.id="matchmakerSearchContainer";const J=document.createElement("div");J.id="matchmakerSearchStatus";te.appendChild(J);const D=document.createElement("div");D.id="matchmakerSearchFeed";te.appendChild(D);const Z=document.createElement("div");Z.id="matchmakerSearchCounter";te.appendChild(Z);const he=document.createElement("div");he.id="matchmakerSearchCancel";he.textContent="Cancel";he.setAttribute("onmouseenter","playTick()");he.addEventListener("click",()=>ct());te.appendChild(he);A.appendChild(te);let rt=[],Oe=!0,lt={key:"Escape",ctrl:!1,shift:!1,alt:!1},U=!1;function ct(){U=!0;const e=window;typeof e.playSelect=="function"&&e.playSelect(),q()}async function Ft(e){try{const t=await(await fetch(`https://matchmaker.krunker.io/game-list?hostname=${window.location.hostname}`)).json(),a=new Map;for(const s of t.games)a.set(s[0],{players:s[2],limit:s[3]});const i=[e,...rt.filter(s=>s.gameID!==e).map(s=>s.gameID)];for(const s of i){const o=a.get(s);if(o&&o.players<o.limit){q(),window.location.href=`https://krunker.io/?game=${s}`;return}}q(),Oe&&typeof window.openServerWindow=="function"&&window.openServerWindow(0)}catch{q(),window.location.href=`https://krunker.io/?game=${e}`}}function q(){document.removeEventListener("keydown",dt,!0),A.parentNode&&A.remove(),A.classList.remove("searching")}function dt(e){document.pointerLockElement||Ht(lt,e)&&(e.preventDefault(),e.stopPropagation(),ct())}function _t(){U=!1,A.classList.add("searching"),A.style.backgroundImage="none",J.textContent="Connecting...",D.innerHTML="",Z.textContent="",document.addEventListener("keydown",dt,!0);const e=document.getElementById("uiBase");e&&e.appendChild(A)}function Ot(e){const n=document.createElement("div");n.className=`mm-feed-entry ${e.passesFilter?"mm-pass":"mm-fail"}`;const t=document.createElement("span");t.className="mm-feed-region",t.textContent=e.region;const a=document.createElement("span");a.className="mm-feed-map",a.textContent=e.map;const i=document.createElement("span");return i.className="mm-feed-players",i.textContent=`${e.playerCount}/${e.playerLimit}`,n.appendChild(t),n.appendChild(a),n.appendChild(i),n}async function Kt(e){if(e.length===0)return;J.textContent="Scanning lobbies...";const n=e.length,t=Math.floor(Ze/Be),a=n>t?n/t:1,i=n>t?Be:Math.max(At,Math.min(Be,Ze/n));for(let s=0;s<n;s+=a){if(U)return;const o=Math.min(Math.floor(s),n-1),r=Ot(e[o]);for(D.appendChild(r);D.children.length>Bt;)D.removeChild(D.firstChild);Z.textContent=`Checked: ${o+1} / ${n} lobbies`,await new Promise(l=>setTimeout(l,i))}Z.textContent=`Checked: ${n} / ${n} lobbies`,U||await new Promise(s=>setTimeout(s,Pt))}async function Ut(e){const t=await(await fetch(`https://matchmaker.krunker.io/game-list?hostname=${window.location.hostname}`)).json(),a=[],i=[];for(const s of t.games){const o=s[0],r=o.split(":")[0],l=s[2],d=s[3],f=s[4].i,p=Lt[s[4].g]??"Unknown Gamemode",h=s[5];let v=!0;(e.regions.length>0&&!e.regions.includes(r)||e.gamemodes.length>0&&!e.gamemodes.includes(p)||e.maps.length>0&&!e.maps.includes(f)||l<e.minPlayers||l>e.maxPlayers||h<e.minRemainingTime||l===d||window.location.href.includes(o))&&(v=!1);const u={gameID:o,region:r,playerCount:l,playerLimit:d,map:f,gamemode:p,remainingTime:h,passesFilter:v};a.push(u),v&&i.push(u)}return{all:a,filtered:i}}function qt(e,n,t){return e.sort((a,i)=>{if(t)return a.playerCount!==i.playerCount?i.playerCount-a.playerCount:(n[a.region]??999)-(n[i.region]??999);const s=n[a.region]??999,o=n[i.region]??999;return s!==o?s-o:i.playerCount-a.playerCount})}async function zt(e,n){Oe=e.openServerBrowser,lt=e.cancelKey,U=!0,q(),_t(),n?.log("[KCC-MM] Fetching game list + pings...");let t,a,i;try{const[s,o]=await Promise.all([Ut(e),c.ipcRenderer.invoke("ping-regions").catch(()=>({}))]);t=s.all,a=s.filtered,i=o}catch{U||(J.textContent="Failed to fetch lobbies",await new Promise(s=>setTimeout(s,2e3)),q());return}if(!U&&(n?.log("[KCC-MM]",a.length,"/",t.length,"games passed filters"),a.length>0&&qt(a,i,e.sortByPlayers),rt=a,Kt(t),await new Promise(s=>setTimeout(s,Nt)),!U))if(a.length>0){const s=a[0],o=i[s.region]??999,r=a.filter(p=>{const h=i[p.region]??999;return Math.abs(h-o)<=20&&s.playerCount-p.playerCount<=2}),l=r[Math.floor(Math.random()*r.length)];n?.log("[KCC-MM] Best match:",l.gameID,l.region,l.map,`(${i[l.region]??"?"}ms, pool: ${r.length})`);const d=st[l.region]??l.region;J.textContent="Lobby Found!",D.innerHTML="";const f=document.createElement("div");f.className="mm-feed-entry mm-pass",f.style.cssText="font-size:1.1em;justify-content:center;",f.innerHTML=`<span class="mm-feed-region">${b(l.region)}</span><span class="mm-feed-map">${b(l.map)}</span><span class="mm-feed-players">${l.playerCount}/${l.playerLimit}</span>`,D.appendChild(f),Z.textContent=`${l.gamemode} · ${d} · ${i[l.region]??"?"}ms`,await new Promise(p=>setTimeout(p,1200)),await Ft(l.gameID)}else n?.log("[KCC-MM] No matching games found"),q(),Oe&&typeof window.openServerWindow=="function"&&window.openServerWindow(0)}const O=[],Ae=new Map;function Gt(e){const n={name:"",author:"",version:"",desc:"",src:"",license:"",runAt:"document-end",priority:0},t=e.match(/\/\/\s*==UserScript==/),a=e.match(/\/\/\s*==\/UserScript==/);if(!t||!a)return n;const i=e.substring(t.index+t[0].length,a.index);for(const s of i.split(`
`)){const o=s.match(/\/\/\s*@(\S+)\s+(.*)/);if(!o)continue;const[,r,l]=o,d=l.trim();switch(r){case"name":n.name=d;break;case"author":n.author=d;break;case"version":n.version=d;break;case"desc":case"description":n.desc=d;break;case"src":n.src=d;break;case"license":n.license=d;break;case"run-at":d==="document-start"?n.runAt="document-start":n.runAt="document-end";break;case"priority":n.priority=parseInt(d,10)||0;break}}return n}function $t(e,n,t){const a=Ae.get(n);if(t){if(a)return;const i=c.webFrame.insertCSS(e);Ae.set(n,i)}else{if(!a)return;c.webFrame.removeInsertedCSS(a),Ae.delete(n)}}function Ke(e,n){if(e.executed)return;const t={_console:n,_css(a,i,s){$t(a,e.filename+":"+i,s)},unload:null,settings:null};try{const a=`
      if (document.readyState !== 'loading') {
        const _origAdd = EventTarget.prototype.addEventListener;
        EventTarget.prototype.addEventListener = function(type, fn, opts) {
          if ((this === window || this === document) && type === 'DOMContentLoaded') {
            Promise.resolve().then(() => fn.call(this, new Event('DOMContentLoaded')));
            return;
          }
          return _origAdd.call(this, type, fn, opts);
        };
        try { ${e.content}
 } finally { EventTarget.prototype.addEventListener = _origAdd; }
      } else { ${e.content}
 }`;new Function(a).apply(t)===t?(e.unload=typeof t.unload=="function"?t.unload:null,e.settings=t.settings):(e.unload=null,e.settings=null),e.executed=!0,n.log("[KCC] Userscript executed:",e.meta.name||e.filename)}catch(a){n.error("[KCC] Userscript error in",e.filename,":",a)}}async function Ue(e){if(!e.settings)return;const n=await c.ipcRenderer.invoke("userscripts-load-prefs",e.filename);for(const t of Object.keys(e.settings))if(t in n){const a=e.settings[t];if(a.value=n[t],typeof a.changed=="function")try{a.changed(a.value)}catch{}}}function jt(){return O}async function Wt(e){const{scripts:n,tracker:t}=await c.ipcRenderer.invoke("userscripts-scan");if(!n||n.length===0){e.log("[KCC] No userscripts found");return}for(const i of n){const s=Gt(i.content);O.push({filename:i.filename,content:i.content,meta:s,enabled:t[i.filename]===!0,executed:!1,unload:null,settings:null})}O.sort((i,s)=>s.meta.priority-i.meta.priority);for(const i of O)i.enabled&&i.meta.runAt==="document-start"&&(Ke(i,e),await Ue(i));const a=()=>{for(const i of O)i.enabled&&i.meta.runAt==="document-end"&&!i.executed&&(Ke(i,e),Ue(i))};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",a,{once:!0}):a(),e.log("[KCC] Userscripts initialized:",O.length,"scripts loaded")}function Qt(e,n,t){const a=O.find(s=>s.filename===e);if(!a)return{needsReload:!1};a.enabled=n;const i={};for(const s of O)i[s.filename]=s.enabled;if(c.ipcRenderer.invoke("userscripts-set-tracker",i),n)return a.executed?{needsReload:!1}:(Ke(a,t),Ue(a),{needsReload:!1});if(a.unload&&a.executed){try{a.unload(),t.log("[KCC] Userscript unloaded:",a.meta.name||a.filename)}catch(s){t.error("[KCC] Userscript unload error:",s)}return a.executed=!1,a.unload=null,a.settings=null,{needsReload:!1}}return{needsReload:a.executed}}const ye={enabled:!0,targetLanguage:"en",showLanguageTag:!0};let G,F={...ye},$=null,K=null;const je="kccTL_",ut=600*1e3;function Vt(e){try{const n=sessionStorage.getItem(je+e.toLowerCase().trim());if(!n)return null;const t=JSON.parse(n);return Date.now()-t.ts>ut?null:t}catch{return null}}function Yt(e,n,t){try{const a={t:n,l:t,ts:Date.now()};sessionStorage.setItem(je+e.toLowerCase().trim(),JSON.stringify(a))}catch{}}const Xt=new Set(["hi","hey","hello","yo","sup","bye","cya","gn","gm","yes","no","yep","yea","yeah","nah","nope","ok","okay","kk","lol","lmao","lmfao","rofl","omg","omfg","wtf","wth","bruh","bro","dude","man","brb","afk","gtg","g2g","smh","tbh","imo","imho","ngl","fr","frfr","fax","idk","idc","idgaf","nvm","stfu","pls","plz","thx","ty","tysm","np","yw","mb","sry","sorry","bet","cap","nocap","sus","mid","based","cringe","ratio","rip","oof","uwu","owo","xd","xdd","xddd","lel","kek","damn","dang","boi","fam","goat","goated","lit","vibe","vibes","lowkey","highkey","deadass","nice","cool","sick","fire","trash","ass","toxic","wow","whoa","wha","huh","wat","wut","hmm","gg","ggwp","ggez","wp","ez","gl","hf","glhf","nt","ns","gj","mvp","clutch","ace","carry","noob","newb","n00b","bot","tryhard","sweat","sweaty","hack","hacks","hacker","hax","cheater","cheats","lag","laggy","ping","fps","dc","disconnect","nerf","buff","op","broken","meta","spam","camp","camper","aim","aimbot","wh","wallhack","esp","rush","push","rotate","flank","peek","hold","one","low","dead","down","res","revive","w","l","dub","win","loss","f","ggs","kr","ak","smg","sniper","shotty","rev","semi","crossy","famas","rpg","lmg","deagle","comp","pub","pubs","ranked","nuke","nuked","nuking","kpd","bhop","bhopping","slidehopping","slidehop","krunker","krunky","yendis","krunkitis","contra","relic","unob","unobtainable","spin","market","trade","gift","drop","drops","skin","skins","clan","verified","lvl","level","trig","trigger","runner","det","detective","vince","bowman","spray","agent","rocketeer","streamer","ttv",":)",":(",":d",":p",":o","<3"]),Jt=new Set(["so","cy","ht","hmn","ceb","haw","la","mg","mi","ny","sm","st","su","sw","tl","yo","zu","sn","ig","rw","co","fy","gd","lb","mt","eo"]);let W=new Map;const pt=3,Zt=3,en=15;let Pe=0;const tn=3,nn=15,j=[];function mt(e){Pe<tn?(Pe++,e().finally(()=>{Pe--,j.length>0&&j.shift()()})):(j.length>=nn&&j.shift(),j.push(()=>mt(e)))}const an=300*1e3;let de=null;function sn(){de||(de=setInterval(()=>{W=new Map;const e=Date.now(),n=[];for(let t=0;t<sessionStorage.length;t++){const a=sessionStorage.key(t);if(a?.startsWith(je))try{const i=JSON.parse(sessionStorage.getItem(a)||"");e-i.ts>ut&&n.push(a)}catch{n.push(a)}}for(const t of n)sessionStorage.removeItem(t)},an))}function on(){de&&(clearInterval(de),de=null)}const rn=["joined the game","left the game","has been kicked","has been banned","vote to kick","press f1","connecting","connected","was arrested","started a vote","was kicked","was banned"];function ln(e){return/^[\x00-\x7F\u00C0-\u024F\u1E00-\u1EFF\s\d.,!?;:'"()\-/@#$%^&*+=~`[\]{}|\\<>]+$/u.test(e)}function cn(e){const n=e.trim();if(n.length<2)return!1;const t=n.replace(/[^a-zA-Z0-9\s]/g,"").toLowerCase().split(/\s+/).filter(i=>i.length>0);if(t.length===0||t.every(i=>Xt.has(i)))return!1;const a=n.toLowerCase();return(W.get(a)??0)>=pt?!1:ln(n)?!(t.length<Zt&&!/[À-ÿ]/.test(n)):!0}function dn(e){const n=e.textContent?.trim();if(!n||n.length<2||e.querySelector("img")||n.startsWith("/"))return null;const t=n.toLowerCase();if(rn.some(i=>t.includes(i)))return null;const a=n.indexOf(":");if(a>0&&a<25){const i=n.substring(0,a+1),s=n.substring(a+1).trim();return s.length>=2?{message:s,username:i}:null}return{message:n,username:""}}async function un(e){const n=Vt(e);if(n)return{translation:n.t,srcLang:n.l};try{const t=new AbortController,a=setTimeout(()=>t.abort(),5e3),i="https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl="+F.targetLanguage+"&dt=t&q="+encodeURIComponent(e),s=await fetch(i,{signal:t.signal});if(clearTimeout(a),!s.ok)return G.warn("[KCC-TL] HTTP",s.status),null;const o=await s.json();if(!o?.[0]?.[0])return null;const r=o[0].map(p=>p[0]).join(""),l=o[2]||"unknown";if(l===F.targetLanguage)return null;const d=p=>p.toLowerCase().replace(/[^a-z0-9]/g,"");if(d(r)===d(e))return null;if(e.length<en&&Jt.has(l)){const p=e.toLowerCase().trim();return W.set(p,(W.get(p)??0)+1),null}if(e.trim().split(/\s+/).length<=2){const p=e.toLowerCase().trim(),h=(W.get(p)??0)+1;if(W.set(p,h),h>=pt)return null}return Yt(e,r,l),{translation:r,srcLang:l}}catch(t){return t.name!=="AbortError"&&G.warn("[KCC-TL] Error:",t.message),null}}function pn(e,n,t,a){const i=document.createElement("div");i.className="kcc-translation";const s=F.showLanguageTag&&a!=="unknown"?" ["+a.toUpperCase()+"]":"";i.textContent="🌐 "+(n?n+" ":"")+t+s,e.appendChild(i)}function mn(e){if(e.hasAttribute("data-kpc-translated"))return;e.setAttribute("data-kpc-translated","1");const n=dn(e);if(!n||!cn(n.message))return;const{message:t,username:a}=n;mt(async()=>{if(!e.isConnected)return;const i=await un(t);i&&e.isConnected&&pn(e,a,i.translation,i.srcLang)})}function ft(){if($)return;let e=0;K=setInterval(()=>{e++;const n=document.getElementById("chatList");if(!n){e>60&&(clearInterval(K),K=null,G.warn("[KCC-TL] #chatList not found after 30s, giving up"));return}clearInterval(K),K=null,$=new MutationObserver(t=>{for(const a of t)for(const i of a.addedNodes)i.nodeType===1&&mn(i)}),$.observe(n,{childList:!0}),sn(),G.log("[KCC-TL] Chat observer active")},500)}function fn(){K&&(clearInterval(K),K=null),$&&($.disconnect(),$=null),on(),j.length=0}function gn(e,n){if(G=e,F={enabled:n.enabled??ye.enabled,targetLanguage:n.targetLanguage??ye.targetLanguage,showLanguageTag:n.showLanguageTag??ye.showLanguageTag},!F.enabled){G.log("[KCC-TL] Translator disabled");return}G.log("[KCC-TL] Initializing (target: "+F.targetLanguage+")"),ft()}function Ne(e){e.enabled!==void 0&&(F.enabled=e.enabled,e.enabled&&!$&&ft(),e.enabled||fn()),e.targetLanguage!==void 0&&(F.targetLanguage=e.targetLanguage),e.showLanguageTag!==void 0&&(F.showLanguageTag=e.showLanguageTag)}const hn=new Set(["Team Deathmatch","Hardpoint","Capture the Flag","Hide & Seek","Infected","Last Man Standing","Simon Says","Prop Hunt","Boss Hunt","Deposit","Stalker","Kill Confirmed","Defuse","Traitor","Blitz","Domination","Squad Deathmatch","Team Defender"]);let E=null,ue=null,we=0,We=!1,He=!1,ce=!1,gt=null;const vn=30;function et(e){return e.nodeType===1&&e.id?.startsWith("chatMsg_")}function kn(){const e=document.getElementById("gameModeLabel")||document.getElementById("subGameMode");return e?hn.has(e.textContent?.trim()||""):!1}function yn(e){if(we>0&&E&&ue){const n=[];for(const t of e){if(He)break;for(const a of t.removedNodes)et(a)&&n.push(a)}if(n.length>0){He=!0,ue.disconnect();const t=E.firstChild;for(const a of n)E.insertBefore(a,t);for(;E.children.length>we;)E.removeChild(E.firstChild);ue.observe(E,{childList:!0}),He=!1}}if(We){const n=kn();for(const t of e)for(const a of t.addedNodes){if(!et(a))continue;const i=a.querySelector(".chatMsg");if(!i)continue;if(i.textContent?.includes("Text & Voice Chat")){a.remove();continue}if(!n||!i.innerHTML.includes("‮:")||!a.dataset.tab)continue;const s=a.dataset.tab==="1",o=document.createElement("div");o.style.cssText="float:left; margin-right:4px; font-weight:bold;",o.style.color=s?"#00FF00":"#FF0000",o.textContent=s?"[T]":"[M]",i.insertBefore(o,i.firstChild)}}E&&!ce&&(E.scrollTop=E.scrollHeight)}function bn(e){return e.scrollHeight-e.scrollTop-e.clientHeight<=vn}function Cn(){if(!E)return;const e=bn(E);ce&&e?(ce=!1,E.classList.remove("kpc-chat-paused")):!ce&&!e&&(ce=!0,E.classList.add("kpc-chat-paused"))}function tt(){return E=document.getElementById("chatList"),E?(ue=new MutationObserver(yn),ue.observe(E,{childList:!0}),E.addEventListener("scroll",Cn,{passive:!0}),gt?.log("[KCC-Chat] Observer attached to #chatList"),!0):!1}function wn(e,n){if(gt=n??null,We=e.betterChat,we=e.chatHistorySize,tt())return;let t=0;const a=setInterval(()=>{(++t>120||tt())&&clearInterval(a)},500)}function Sn(e){We=e}function En(e){we=e}let Se=null,_=null,Q=null,be=0,V=null,Y=null;function xn(){const e=document.querySelectorAll("#tScoreC1, #tScoreC2");for(const n of e){if(n.className.includes("you"))continue;const t=n.nextElementSibling;if(!t)continue;const a=parseInt(t.textContent||"0",10);a>be&&Q&&(Q.textContent=String((a-be)/10),V&&clearTimeout(V),V=setTimeout(()=>{Q&&(Q.textContent="0"),V=null},1600)),be=a}}function Ln(){const e=document.querySelector(".topRightCounters");if(!e||_)return;_=document.createElement("div"),_.className="statIcon kpc-hp-counter",_.innerHTML='<div class="greyInner" style="display:flex"><span style="color:white;font-size:15px;margin-right:4px;">on</span><span class="pointVal">0</span></div>',Q=_.querySelector(".pointVal"),e.appendChild(_);const n=document.getElementById("teamScores");n&&(Se=new MutationObserver(xn),Se.observe(n,{childList:!0,subtree:!0}))}function Tn(){Y=setInterval(()=>{document.querySelector(".cmpTmHed")&&(Y&&(clearInterval(Y),Y=null),Ln())},2e3)}function Mn(){clearInterval(Y),Y=null,Se?.disconnect(),Se=null,_?.remove(),_=null,clearTimeout(V),V=null,Q=null,be=0}function ht(){Tn()}function In(){Mn()}const z=[{rank:"Unranked",elo:null,color:"#FFFFFF",image:"rank_unranked.svg"},{rank:"Bronze 1",elo:0,color:"#CD7F32",image:"rank_bronze.svg"},{rank:"Bronze 2",elo:200,color:"#CD7F32",image:"rank_bronze.svg"},{rank:"Bronze 3",elo:400,color:"#CD7F32",image:"rank_bronze.svg"},{rank:"Silver 1",elo:700,color:"#C0C0C0",image:"rank_silver.svg"},{rank:"Silver 2",elo:900,color:"#C0C0C0",image:"rank_silver.svg"},{rank:"Silver 3",elo:1100,color:"#C0C0C0",image:"rank_silver.svg"},{rank:"Gold 1",elo:1300,color:"#FFD700",image:"rank_gold.svg"},{rank:"Gold 2",elo:1600,color:"#FFD700",image:"rank_gold.svg"},{rank:"Gold 3",elo:2e3,color:"#FFD700",image:"rank_gold.svg"},{rank:"Platinum",elo:2300,color:"#4B69FF",image:"rank_platinum.svg"},{rank:"Diamond",elo:3e3,color:"#4B69FF",image:"rank_diamond.svg"},{rank:"Master",elo:3300,color:"#EE7032",image:"rank_master.svg"},{rank:"Kracked",elo:4700,color:"#FF0000",image:"rank_kracked.svg"}],qe="https://assets.krunker.io/img/ranked/ranks/";function Rn(e){let n=0;for(let o=z.length-1;o>=0;o--)if(z[o].elo!==null&&e>=z[o].elo){n=o;break}const t=z[n],a=z[n+1]||t,i=n===z.length-1;let s=0;return!i&&t.elo!==null&&a.elo!==null?s=Math.min(100,Math.max(0,(e-t.elo)/(a.elo-t.elo)*100)):i&&(s=100),{current:t,next:a,progress:s,isMax:i}}function Bn(){if(document.getElementById("kpc-rank-overlay"))return;const e=document.createElement("div");e.id="kpc-rank-overlay",e.addEventListener("mousedown",t=>{t.target===e&&e.remove()});let n="";for(const t of z)n+=`<div class="kpc-rank-grid-item">
            <img src="${qe}${t.image}" loading="lazy">
            <div><div class="kpc-rank-name" style="color:${t.color}">${t.rank}</div>
            <div class="kpc-rank-elo">${t.elo!==null?t.elo+"+":"Placement"}</div></div></div>`;e.innerHTML=`<div class="kpc-rank-popup">
        <div class="kpc-rank-popup-header"><h2>Rank Distribution</h2>
        <div class="kpc-rank-popup-close" id="kpc-rank-close">✕</div></div>
        <div class="kpc-rank-grid">${n}</div></div>`,document.body.appendChild(e),document.getElementById("kpc-rank-close")?.addEventListener("click",()=>e.remove())}function An(e){if(e.querySelector("#kpc-elo-tracker"))return;const n=e.querySelectorAll(".quick-stat-value");if(!n.length)return;const t=Number(n[0].textContent);if(isNaN(t))return;const a=Rn(t),i=document.createElement("div");i.id="kpc-elo-tracker";const s=a.isMax?"":`<div class="kpc-rank-container"><img src="${qe}${a.next.image}" class="kpc-elo-rank-img"><span>${a.next.rank}</span></div>`,o=a.isMax?`${t}`:`${t} / ${a.next.elo}`;i.innerHTML=`<div class="kpc-elo-info-row">
        <div class="kpc-rank-container"><img src="${qe}${a.current.image}" class="kpc-elo-rank-img"><span>${a.current.rank}</span></div>
        <div class="kpc-elo-bar-bg"><div class="kpc-elo-bar-fill" style="width:${a.progress}%"></div>
        <div class="kpc-elo-bar-text">${o}</div></div>${s}</div>`;const r=e.querySelector(".quick-stats");r?e.insertBefore(i,r):e.appendChild(i)}function Pn(e){if(e.querySelector("#kpc-rank-list-btn"))return;const n=document.createElement("div");n.id="kpc-rank-list-btn",n.innerHTML='<span class="material-icons" style="font-size:16px;vertical-align:middle;margin-right:4px;">list</span> Ranks',n.addEventListener("click",Bn),getComputedStyle(e).position==="static"&&(e.style.position="relative"),e.appendChild(n)}function nt(){const e=document.querySelector(".rank-card"),n=document.querySelector(".rank-and-stats");e&&n&&(An(n),Pn(e))}function Nn(){const e=document.querySelector(".footer-controls");if(!e||e.querySelector("#kpc-ranked-queue-btn"))return;const n=document.createElement("button");n.id="kpc-ranked-queue-btn",n.className="kpc-ranked-queue-btn",n.innerHTML='<span class="material-icons" style="font-size:20px;vertical-align:middle;">open_in_new</span>',n.title="Open External Queue",n.addEventListener("click",()=>{let a=localStorage.getItem("__FRVR_auth_access_token")||"";a=a.replace(/"/g,"").replace(/\//g,"");const i=document.querySelector(".region-indicator");let s="na";if(i){const l=(i.textContent||"").split(": "),d=l[1]||l[0];d.includes("Europe")?s="eu":d.includes("Asia")&&(s="as")}const o=localStorage.getItem("s_rankedAllRegions")==="true";c.ipcRenderer.send("open-ranked-queue",a,s,o)});const t=e.lastElementChild;t?e.insertBefore(n,t):e.appendChild(n)}function Hn(){let e=0;const n=setInterval(()=>{const t=window.openRankedMenu;if(t&&!t.__kpcRankPatched){clearInterval(n);let a=null,i=null;const s=function(...o){t.apply(this,o);const r=document.querySelector(".rankedMenuModal");r&&(a=new MutationObserver(nt),a.observe(r,{childList:!0,subtree:!0}),nt(),Nn(),i=setInterval(()=>{document.querySelector(".rankedMenuModal")||(a&&(a.disconnect(),a=null),i&&(clearInterval(i),i=null))},5e3))};s.__kpcRankPatched=!0,window.openRankedMenu=s}else++e>75&&clearInterval(n)},200)}function Dn(e,n){const t=e.split(".").map(Number),a=n.split(".").map(Number),i=Math.max(t.length,a.length);for(let s=0;s<i;s++){const o=t[s]||0,r=a[s]||0;if(o<r)return!0;if(o>r)return!1}return!1}function Fn(e){try{const n=new URL(e);if(n.protocol==="https:"||n.protocol==="http:")return b(e)}catch{}return"#"}function _n(e){const a=b(e).replace(/### (.+)/g,"<h3>$1</h3>").replace(/## (.+)/g,"<h2>$1</h2>").replace(/# (.+)/g,"<h1>$1</h1>").replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>").replace(/\*(.+?)\*/g,"<em>$1</em>").replace(/\[([^\]]+)\]\(([^)]+)\)/g,(o,r,l)=>`<a href="${Fn(l)}" target="_blank">${r}</a>`).split(`
`);let i=!1;const s=[];for(const o of a)o.trimStart().startsWith("- ")?(i||(s.push("<ul>"),i=!0),s.push("<li>"+o.trimStart().slice(2)+"</li>")):(i&&(s.push("</ul>"),i=!1),s.push(o));return i&&s.push("</ul>"),s.join(`
`).replace(/\n\n/g,"<br><br>").replace(/\n/g,"<br>")}function On(e,n){const t=document.createElement("div");t.id="kpc-changelog-host";const a=t.attachShadow({mode:"closed"}),i=document.createElement("style");i.textContent=`
        .overlay {
            position: fixed; top: 0; left: 0; width: 100vw; height: 100vh;
            background: rgba(0,0,0,0.75); z-index: 99998;
            display: flex; justify-content: center; align-items: center;
            font-family: 'Segoe UI', sans-serif; color: #e0e0e0;
        }
        .modal {
            background: #1a1a2e; border-radius: 12px; padding: 24px;
            min-width: 400px; max-width: 600px; max-height: 70vh;
            display: flex; flex-direction: column; box-shadow: 0 8px 32px rgba(0,0,0,0.5);
        }
        .header {
            display: flex; justify-content: space-between; align-items: center;
            margin-bottom: 16px;
        }
        .header h2 { margin: 0; font-size: 1.4rem; color: #fff; }
        .close-btn {
            background: none; border: none; color: #888; font-size: 1.5rem;
            cursor: pointer; padding: 4px 8px; border-radius: 4px;
        }
        .close-btn:hover { color: #fff; background: rgba(255,255,255,0.1); }
        .body {
            overflow-y: auto; flex: 1; line-height: 1.6;
        }
        .body h1 { font-size: 1.3rem; color: #fff; margin: 12px 0 6px; }
        .body h2 { font-size: 1.15rem; color: #fff; margin: 10px 0 6px; }
        .body h3 { font-size: 1rem; color: #ccc; margin: 8px 0 4px; }
        .body ul { padding-left: 20px; margin: 6px 0; }
        .body li { margin: 3px 0; }
        .body a { color: #6ea8fe; }
        .body strong { color: #fff; }
    `;const s=document.createElement("div");s.className="overlay",s.addEventListener("click",f=>{f.target===s&&t.remove()});const o=document.createElement("div");o.className="modal";const r=document.createElement("div");r.className="header",r.innerHTML=`<h2>What's New in v${b(e)}</h2>`;const l=document.createElement("button");l.className="close-btn",l.textContent="✕",l.addEventListener("click",()=>t.remove()),r.appendChild(l);const d=document.createElement("div");d.className="body",d.innerHTML=_n(n),o.appendChild(r),o.appendChild(d),s.appendChild(o),a.appendChild(i),a.appendChild(s),document.body.appendChild(t)}async function Kn(e,n){if(!(n&&!Dn(n,e))){c.ipcRenderer.invoke("set-config","ui",{...await c.ipcRenderer.invoke("get-config","ui"),lastSeenVersion:e});try{const t=await c.ipcRenderer.invoke("changelog-fetch",e);t&&On(e,t)}catch{}}}let Qe=!1;const B={log:(...e)=>{console.log(...e),Qe&&c.ipcRenderer.send("verbose-log","log",...e)},warn:(...e)=>{console.warn(...e),c.ipcRenderer.send("verbose-log","warn",...e)},error:(...e)=>{console.error(...e),c.ipcRenderer.send("verbose-log","error",...e)}};B.log("[KCC] Preload script loaded");const vt='<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24"><path d="M12 12.5ZM3.425 20.5Q2.9 20.5 2.65 20.05Q2.4 19.6 2.65 19.15L11.2 4.35Q11.475 3.9 12 3.9Q12.525 3.9 12.8 4.35L21.35 19.15Q21.6 19.6 21.35 20.05Q21.1 20.5 20.575 20.5ZM12 10.2Q11.675 10.2 11.463 10.412Q11.25 10.625 11.25 10.95V14.45Q11.25 14.75 11.463 14.975Q11.675 15.2 12 15.2Q12.325 15.2 12.538 14.975Q12.75 14.75 12.75 14.45V10.95Q12.75 10.625 12.538 10.412Q12.325 10.2 12 10.2ZM12 17.8Q12.35 17.8 12.575 17.575Q12.8 17.35 12.8 17Q12.8 16.65 12.575 16.425Q12.35 16.2 12 16.2Q11.65 16.2 11.425 16.425Q11.2 16.65 11.2 17Q11.2 17.35 11.425 17.575Q11.65 17.8 12 17.8ZM4.45 19H19.55L12 6Z"/></svg>',Un='<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M12 6v1.79c0 .45.54.67.85.35l2.79-2.79c.2-.2.2-.51 0-.71l-2.79-2.79c-.31-.31-.85-.09-.85.36V4c-4.42 0-8 3.58-8 8 0 1.04.2 2.04.57 2.95.27.67 1.13.85 1.64.34.27-.27.38-.68.23-1.04C6.15 13.56 6 12.79 6 12c0-3.31 2.69-6 6-6zm5.79 2.71c-.27.27-.38.69-.23 1.04.28.7.44 1.46.44 2.25 0 3.31-2.69 6-6 6v-1.79c0-.45-.54-.67-.85-.35l-2.79 2.79c-.2.2-.2.51 0 .71l2.79 2.79c.31.31.85.09.85-.35V20c4.42 0 8-3.58 8-8 0-1.04-.2-2.04-.57-2.95-.27-.67-1.13-.85-1.64-.34z"/></svg>',qn=["This setting is safe/standard","Proceed with caution","This setting is not recommended","This setting is experimental","This setting is experimental and unstable. Use at your own risk."];let fe=0,M=null;function zn(e){return'<span class="desc-icon" title="'+e+'">'+vt+"</span>"}function Ee(e){return'<span class="desc-icon '+e+'" title="'+(e==="instant"?"Applies instantly! (No refresh of page required)":"Refresh page to see changes")+'">'+Un+"</span>"}function Gn(){return'<span class="desc-icon restart-icon" title="Requires client restart">'+vt+"</span>"}function Le(e,n,t,a){return e>0?zn(qn[e]):n?Ee("instant"):t?Ee("refresh-icon"):a?Gn():""}function I(e){const n=e==="restart"?2:1;n>fe&&(fe=n),$n()}function $n(){if(fe===0){M&&(M.remove(),M=null);return}if(M)try{M.remove()}catch{}M=document.createElement("div"),M.className="kpc-holder-update refresh-popup",fe===2?M.innerHTML='<span class="restart-msg">Restart client fully to see changes</span>':M.innerHTML='<span class="reload-msg">'+Ee("refresh-icon")+"Reload page with <code>F5</code> or <code>CTRL + R</code> to see changes</span>",document.body.appendChild(M)}window.OffCliV=!0;window.kpc={platform:{getInfo:()=>c.ipcRenderer.invoke("get-platform")},config:{get:e=>c.ipcRenderer.invoke("get-config",e),getAll:e=>c.ipcRenderer.invoke("get-all-config",e),set:(e,n)=>c.ipcRenderer.invoke("set-config",e,n)},window:{minimize:()=>c.ipcRenderer.invoke("window-minimize"),maximize:()=>c.ipcRenderer.invoke("window-maximize"),close:()=>c.ipcRenderer.invoke("window-close"),isMaximized:()=>c.ipcRenderer.invoke("window-is-maximized")},dev:{toggleDevTools:()=>c.ipcRenderer.invoke("toggle-devtools")},swapper:{openFolder:()=>c.ipcRenderer.invoke("open-swap-folder"),getPath:()=>c.ipcRenderer.invoke("get-swap-dir")},userscripts:{openFolder:()=>c.ipcRenderer.invoke("userscripts-open-folder"),getPath:()=>c.ipcRenderer.invoke("userscripts-get-dir")}};function xe(e){return(e.shift?"Shift+":"")+(e.ctrl?"Ctrl+":"")+(e.alt?"Alt+":"")+e.key.toUpperCase()}let pe=null;const ge=document.createElement("div");ge.className="kpc-keybind-overlay";const ne=document.createElement("div");ne.className="kpc-keybind-dialog";const Ve=document.createElement("div");Ve.className="kpc-keybind-dialog-title";const Ye=document.createElement("div");Ye.className="kpc-keybind-dialog-sub";Ye.innerHTML="Press any key. Press <code>Shift+Escape</code> to cancel.";const ve=document.createElement("div");ve.className="kpc-keybind-dialog-modifiers";const ae=document.createElement("div");ae.className="kpc-keybind-modifier";ae.textContent="Shift";const se=document.createElement("div");se.className="kpc-keybind-modifier";se.textContent="Control";const ie=document.createElement("div");ie.className="kpc-keybind-modifier";ie.textContent="Alt";const Te=document.createElement("div");Te.className="kpc-keybind-dialog-cancel";Te.textContent="Cancel";Te.addEventListener("click",Ce);ve.appendChild(ae);ve.appendChild(se);ve.appendChild(ie);ne.appendChild(Te);ne.appendChild(Ve);ne.appendChild(Ye);ne.appendChild(ve);ge.appendChild(ne);function Ce(){ae.classList.remove("active"),se.classList.remove("active"),ie.classList.remove("active"),document.removeEventListener("keydown",kt,!0),document.removeEventListener("keyup",yt,!0),ge.parentNode&&ge.remove(),pe=null,c.ipcRenderer.send("keybind-capture",!1)}function kt(e){e.stopImmediatePropagation(),e.preventDefault(),e.key==="Control"?se.classList.add("active"):e.key==="Shift"?ae.classList.add("active"):e.key==="Alt"&&ie.classList.add("active")}function yt(e){if(e.stopImmediatePropagation(),e.preventDefault(),!pe)return;if(e.key==="Escape"&&e.shiftKey){Ce();return}if(e.key==="Shift"||e.key==="Control"||e.key==="Alt"){const t={key:e.key,ctrl:!1,shift:!1,alt:!1};pe.resolve(t),Ce();return}const n={key:e.key,ctrl:e.ctrlKey,shift:e.shiftKey,alt:e.altKey};pe.resolve(n),Ce()}function bt(e){return new Promise(n=>{pe={resolve:n},Ve.textContent="Edit Keybind: "+e,ae.classList.remove("active"),se.classList.remove("active"),ie.classList.remove("active"),c.ipcRenderer.send("keybind-capture",!0),document.addEventListener("keydown",kt,!0),document.addEventListener("keyup",yt,!0),document.body.appendChild(ge)})}function ze(e,n,t,a,i,s){const r=document.createElement("div");r.className="setting settName safety-0 keybind",r.innerHTML=Le(0,s)+'<span class="setting-title">'+b(e)+'</span><span class="keyIcon kpc-keyIcon">'+b(xe(t))+'</span><div class="setting-desc-new">'+b(n)+"</div>";const l=r.querySelector(".kpc-keyIcon");return l.addEventListener("click",()=>{bt(e).then(d=>{l.textContent=xe(d),a(d)})}),r}function w(e){const n=e.safety||0,t=document.createElement("div");if(t.className="setting settName safety-"+n+" bool",t.innerHTML=Le(n,e.instant,e.refreshOnly,e.restart)+'<span class="setting-title">'+b(e.label)+'</span><label class="switch"><input type="checkbox" class="s-update"'+(e.checked?" checked":"")+(e.disabled?" disabled":"")+'><div class="slider round"></div></label><div class="setting-desc-new">'+b(e.desc)+"</div>",!e.disabled){const a=t.querySelector('input[type="checkbox"]');a.addEventListener("change",()=>{e.onChange(a.checked),e.restart?I("restart"):e.refreshOnly&&I("refresh")})}return t}function Me(e){const n=e.safety||0,t=document.createElement("div");t.className="setting settName safety-"+n+" sel",t.innerHTML=Le(n,e.instant,e.refreshOnly,e.restart)+'<span class="setting-title">'+b(e.label)+'</span><div class="setting-desc-new">'+b(e.desc)+"</div>";const a=document.createElement("select");a.className="s-update inputGrey2";for(const i of e.options){const s=document.createElement("option");s.value=i.value,s.textContent=i.label,i.value===e.value&&(s.selected=!0),a.appendChild(s)}return a.addEventListener("change",()=>{e.onChange(a.value),e.restart?I("restart"):e.refreshOnly&&I("refresh")}),t.appendChild(a),t}function X(e){const n=e.safety||0,t=e.step||1,a=t<1?parseFloat:parseInt,i=document.createElement("div");i.className="setting settName safety-"+n+" num",i.innerHTML=Le(n,e.instant,e.refreshOnly,e.restart)+'<span class="setting-title">'+b(e.label)+'</span><span class="setting-input-wrapper"><div class="slidecontainer"><input type="range" class="sliderM s-update-secondary" min="'+e.min+'" max="'+e.max+'" step="'+t+'" value="'+e.value+'"></div><input type="number" class="rb-input s-update sliderVal" min="'+e.min+'" max="'+e.max+'" step="'+t+'" value="'+e.value+'"></span><div class="setting-desc-new">'+b(e.desc)+"</div>";const s=i.querySelector('input[type="range"]'),o=i.querySelector('input[type="number"]');return s.addEventListener("input",()=>{o.value=s.value}),s.addEventListener("change",()=>{const r=Math.max(e.min,Math.min(e.max,a(s.value)||0));s.value=String(r),o.value=String(r),e.onChange(r),e.restart?I("restart"):e.refreshOnly&&I("refresh")}),o.addEventListener("change",()=>{const r=Math.max(e.min,Math.min(e.max,a(o.value)||0));o.value=String(r),s.value=String(r),e.onChange(r),e.restart?I("restart"):e.refreshOnly&&I("refresh")}),i}function De(e){const n=document.createElement("div");n.className="setting settName safety-0 multisel",n.innerHTML='<span class="setting-title">'+b(e.header)+"</span>";const t=document.createElement("div");t.className="kpc-multisel-parent";for(const a of e.items){const i=document.createElement("label");i.className="hostOpt",i.innerHTML='<span class="optName">'+b(a.label)+'</span><input type="checkbox"'+(e.selected.includes(a.value)?" checked":"")+'><div class="optCheck"></div>';const s=i.querySelector("input");s.addEventListener("change",()=>{if(s.checked)e.selected.includes(a.value)||e.selected.push(a.value);else{const o=e.selected.indexOf(a.value);o>=0&&e.selected.splice(o,1)}e.onChange(e.selected)}),t.appendChild(i)}return n.appendChild(t),n}let ke=null;function jn(){function e(i){ke=new MutationObserver(()=>{const s=i.textContent;if(!s)return;const o=s.match(/(\d+)/);if(!o)return;const r=parseInt(o[1])*2;ke.disconnect(),i.textContent=s.replace(o[1],String(r)),ke.observe(i,{childList:!0,characterData:!0,subtree:!0})}),ke.observe(i,{childList:!0,characterData:!0,subtree:!0})}const n=document.getElementById("pingText");if(n){e(n);return}let t=0;const a=setInterval(()=>{if(++t>60){clearInterval(a);return}const i=document.getElementById("pingText");i&&(clearInterval(a),e(i))},500)}function Wn(){const e=window;let n=0;const t=setInterval(()=>{const a=e.windows?.[22]?.genList;if(a&&!a.__kpcPingPatched){clearInterval(t);const i=function(){const s=a.call(this),r=new DOMParser().parseFromString(s,"text/html");for(const l of r.querySelectorAll(".pListPing.material-icons")){const d=l.getAttribute("title");l.classList.remove("pListPing","material-icons"),l.removeAttribute("title"),l.textContent=d?d+" ":"N/A "}return r.body.innerHTML};i.__kpcPingPatched=!0,e.windows[22].genList=i}else++n>75&&clearInterval(t)},200)}function Qn(){const e=window,n=e.windows[0];let t=n.tabIndex;function a(){const l=n.tabs[n.settingType];return l&&t===l.length-1}function i(){a()&&re()}const s=e.showWindow.bind(e),o=n.changeTab.bind(n),r=n.searchList.bind(n);e.showWindow=(...l)=>{const d=s(...l);if(l[0]===1){n.settingType==="basic"&&n.toggleType({checked:!0});const f=document.querySelector(".advancedSwitch input#typeBtn");f&&(f.disabled=!0,f.nextElementSibling&&f.nextElementSibling.setAttribute("title","Client auto-enables advanced settings mode"));const h=document.getElementById("settSearch")?.value?.trim()??"";h.length>0?re(h):a()&&re()}return d},n.changeTab=(...l)=>{const d=o(...l);return t=n.tabIndex,i(),d},n.searchList=(...l)=>{const d=r(...l),p=document.getElementById("settSearch")?.value?.trim()??"";if(p.length>0)re(p);else{const h=document.querySelector("#settHolder .kpc-settings");h&&!a()?h.remove():a()&&re()}return d},i()}function R(e,n){const t=document.createElement("div"),a=document.createElement("div");a.className="setHed",a.innerHTML='<span class="material-icons plusOrMinus">'+(n?"keyboard_arrow_right":"keyboard_arrow_down")+"</span>"+e;const i=document.createElement("div");return i.className="setBodH"+(n?" setting-category-collapsed":""),a.addEventListener("click",()=>{const s=i.classList.toggle("setting-category-collapsed"),o=a.querySelector(".plusOrMinus");o&&(o.textContent=s?"keyboard_arrow_right":"keyboard_arrow_down")}),t.appendChild(a),t.appendChild(i),{section:t,body:i}}function Vn(e,n,t,a){const s={...{lastServer:"",socialTabBehaviour:"New Window",rememberTabs:!1},...n};e.appendChild(Me({label:"Social/Hub Tab Behaviour",desc:"How social, market, and editor pages open when clicked",options:[{value:"New Window",label:"Tabs (Separate Window)"},{value:"Same Window",label:"Tabs (Overlay Game)"}],value:s.socialTabBehaviour,instant:!0,onChange:d=>{s.socialTabBehaviour=d,c.ipcRenderer.invoke("set-config","game",s)}})),e.appendChild(w({label:"Remember Tabs",desc:"Restore your open tabs when you reopen the social/hub window",checked:s.rememberTabs,instant:!0,onChange:d=>{s.rememberTabs=d,c.ipcRenderer.invoke("set-config","game",s)}}));const r={...{showExitButton:!0,deathscreenAnimation:!1,hideMenuPopups:!1},...t};function l(){c.ipcRenderer.invoke("set-config","ui",r)}e.appendChild(w({label:"Show Exit Button",desc:"Show the exit button in the game sidebar",checked:r.showExitButton,instant:!0,onChange:d=>{r.showExitButton=d,l();const f=document.getElementById("clientExit");f&&(f.style.display=d?"flex":"none")}})),e.appendChild(w({label:"Join as Spectator",desc:"Automatically enable spectate mode when joining a game",checked:s.joinAsSpectator,instant:!0,onChange:d=>{s.joinAsSpectator=d,c.ipcRenderer.invoke("set-config","game",s)}})),e.appendChild(w({label:"Show Changelog",desc:"Show release notes popup when the client updates",checked:r.showChangelog??!0,instant:!0,onChange:d=>{r.showChangelog=d,l()}})),e.appendChild(ze("Toggle Fullscreen","Fullscreen the game window (default F11)",a.binds.fullscreenToggle,d=>{a.binds.fullscreenToggle=d,a.saveBinds()},void 0,!0))}function Yn(e,n,t,a){const i={rawInput:!0,showPing:!0,hpEnemyCounter:!0,...n},s={deathscreenAnimation:!1,hideMenuPopups:!1,menuTimer:!0,doublePing:!0,...t};function o(){c.ipcRenderer.invoke("set-config","game",i)}function r(){c.ipcRenderer.invoke("set-config","ui",s)}a.isWindows&&e.appendChild(w({label:"Raw Input",desc:"Bypass OS mouse acceleration for direct 1:1 sensor input (Windows only)",checked:i.rawInput??!0,refreshOnly:!0,onChange:l=>{i.rawInput=l,o()}})),e.appendChild(w({label:"Show Ping in Player List",desc:"Replace the ping icon with numeric millisecond values in the player list",checked:i.showPing??!0,refreshOnly:!0,onChange:l=>{i.showPing=l,o()}})),e.appendChild(w({label:"Double Ping Display",desc:"Show the real ping value (Krunker displays half the actual latency)",checked:s.doublePing??!0,refreshOnly:!0,onChange:l=>{s.doublePing=l,r()}})),e.appendChild(w({label:"Hardpoint Enemy Counter",desc:"Show enemy capture points in Hardpoint mode",checked:i.hpEnemyCounter??!0,refreshOnly:!0,onChange:l=>{i.hpEnemyCounter=l,o(),l?ht():In()}})),e.appendChild(w({label:"Block Death Screen Animation",desc:"Disable the slide-in animation on the death screen",checked:s.deathscreenAnimation,instant:!0,onChange:l=>{s.deathscreenAnimation=l,r(),Fe(l)}})),e.appendChild(w({label:"Hide Menu Popups",desc:"Hide promotional notifications, offers, and streams on the main menu",checked:s.hideMenuPopups,instant:!0,onChange:l=>{s.hideMenuPopups=l,r(),l?Ge():la()}})),e.appendChild(w({label:"Menu Timer",desc:"Show the game/spectate timer on the menu screen",checked:s.menuTimer??!0,instant:!0,onChange:l=>{s.menuTimer=l,r(),_e(l)}})),s.deathscreenAnimation&&Fe(!0),(s.menuTimer??!0)&&_e(!0),s.hideMenuPopups&&Ge()}function Xn(e,n,t){const a={fpsUnlocked:!0,cpuThrottleGame:1,cpuThrottleMenu:1.5,processPriority:"Normal",...n};function i(){c.ipcRenderer.invoke("set-config","performance",a)}e.appendChild(w({label:"Unlimited FPS",desc:"Uncap the frame rate (requires restart)",checked:a.fpsUnlocked,restart:!0,onChange:s=>{a.fpsUnlocked=s,i()}})),e.appendChild(X({label:"CPU Throttle (Game)",desc:"CPU throttle rate during gameplay (1 = no throttle, 3 = heavy throttle)",min:1,max:3,step:.01,value:a.cpuThrottleGame,instant:!0,safety:2,onChange:s=>{a.cpuThrottleGame=s,i()}})),e.appendChild(X({label:"CPU Throttle (Menu)",desc:"CPU throttle rate on menu screens (1 = no throttle, 3 = heavy throttle)",min:1,max:3,step:.01,value:a.cpuThrottleMenu,instant:!0,safety:1,onChange:s=>{a.cpuThrottleMenu=s,i()}})),t&&e.appendChild(Me({label:"Process Priority",desc:"OS-level process priority for the client (Windows only)",options:[{value:"Normal",label:"Normal"},{value:"Above Normal",label:"Above Normal"},{value:"High",label:"High"},{value:"Below Normal",label:"Below Normal"},{value:"Low",label:"Low"}],value:a.processPriority,restart:!0,safety:2,onChange:s=>{a.processPriority=s,i()}}))}function Jn(e,n){const t=n?n.enabled:!0;e.appendChild(w({label:"Resource Swapper",desc:"Replace game textures, sounds, and models with local files",checked:t,restart:!0,onChange:s=>{c.ipcRenderer.invoke("get-config","swapper").then(o=>{c.ipcRenderer.invoke("set-config","swapper",{enabled:s,path:o?o.path:""})})}}));const a=document.createElement("div");a.className="setting settName safety-0 has-button",a.innerHTML='<span class="setting-title">Swapper Folder</span><div class="setting-desc-new">Place replacement assets here (textures/, sound/, models/)</div>';const i=document.createElement("div");i.className="settingsBtn",i.title="Open Folder",i.innerHTML='<span class="material-icons">folder</span> Swapper',i.addEventListener("click",()=>c.ipcRenderer.invoke("open-swap-folder")),a.appendChild(i),e.appendChild(a)}function Zn(e,n){const t={cssTheme:"disabled",loadingTheme:"disabled",backgroundUrl:"",...n};function a(){c.ipcRenderer.invoke("set-config","ui",t)}const i=document.createElement("div");i.className="setting settName safety-0 sel has-button",i.innerHTML='<span class="setting-title">CSS Theme</span><div class="setting-desc-new">Load a custom CSS theme from swap/themes/</div>';const s=document.createElement("select");s.className="s-update inputGrey2",s.innerHTML='<option value="disabled">Loading...</option>',i.appendChild(s);const o=document.createElement("div");o.className="settingsBtn",o.title="Open Themes Folder",o.innerHTML='<span class="material-icons">folder</span>',o.addEventListener("click",()=>c.ipcRenderer.invoke("open-themes-folder")),i.appendChild(o),e.appendChild(i),c.ipcRenderer.invoke("list-themes").then(h=>{s.innerHTML="";for(const v of h){const u=document.createElement("option");u.value=v.id,u.textContent=v.label,v.id===t.cssTheme&&(u.selected=!0),s.appendChild(u)}}),s.addEventListener("change",()=>{t.cssTheme=s.value,a(),I("refresh")});const r=document.createElement("div");r.className="setting settName safety-0 sel has-button",r.innerHTML='<span class="setting-title">Loading Background</span><div class="setting-desc-new">Custom background image for the loading screen (swap/backgrounds/)</div>';const l=document.createElement("select");l.className="s-update inputGrey2",l.innerHTML='<option value="disabled">Loading...</option>',r.appendChild(l);const d=document.createElement("div");d.className="settingsBtn",d.title="Open Backgrounds Folder",d.innerHTML='<span class="material-icons">folder</span>',d.addEventListener("click",()=>c.ipcRenderer.invoke("open-backgrounds-folder")),r.appendChild(d),e.appendChild(r),c.ipcRenderer.invoke("list-loading-themes").then(h=>{l.innerHTML="";for(const v of h){const u=document.createElement("option");u.value=v.id,u.textContent=v.label,v.id===t.loadingTheme&&(u.selected=!0),l.appendChild(u)}}),l.addEventListener("change",()=>{t.loadingTheme=l.value,a(),I("refresh")});const f=document.createElement("div");f.className="setting settName safety-0",f.innerHTML=Ee("refresh-icon")+'<span class="setting-title">Background URL</span><div class="setting-desc-new">Direct image URL for loading screen (overrides dropdown above)</div>';const p=document.createElement("input");p.type="text",p.className="inputGrey2",p.placeholder="https://example.com/image.png",p.value=t.backgroundUrl||"",p.style.width="300px",p.addEventListener("change",()=>{t.backgroundUrl=p.value.trim(),a(),I("refresh")}),f.appendChild(p),e.appendChild(f)}function ea(e,n,t){const a=n||{enabled:!0,regions:[],gamemodes:[],minPlayers:1,maxPlayers:6,minRemainingTime:120,openServerBrowser:!0,sortByPlayers:!1};function i(){c.ipcRenderer.invoke("set-config","matchmaker",a)}e.appendChild(w({label:"Custom Matchmaker",desc:"Use the matchmaker hotkey to find a game matching your criteria",checked:a.enabled,instant:!0,onChange:s=>{a.enabled=s,i()}})),e.appendChild(w({label:"Open Server Browser on Cancel",desc:"Opens the server browser when no game is found and you cancel",checked:a.openServerBrowser,instant:!0,onChange:s=>{a.openServerBrowser=s,i()}})),e.appendChild(w({label:"Prioritize Player Count",desc:"Sort results by most players first, then by ping (default is ping first)",checked:a.sortByPlayers??!1,instant:!0,onChange:s=>{a.sortByPlayers=s,i()}})),e.appendChild(ze("Matchmaker Hotkey","Key to trigger the custom matchmaker",t.binds.matchmaker,s=>{t.binds.matchmaker=s,t.saveBinds()},void 0,!0)),e.appendChild(ze("Matchmaker Cancel","Key to dismiss the matchmaker popup",t.binds.matchmakerCancel,s=>{t.binds.matchmakerCancel=s,t.saveBinds()},void 0,!0)),e.appendChild(X({label:"Min Players",desc:"Minimum player count in lobby (0-7)",min:0,max:7,value:a.minPlayers,instant:!0,onChange:s=>{a.minPlayers=s,i()}})),e.appendChild(X({label:"Max Players",desc:"Maximum player count in lobby (0-7)",min:0,max:7,value:a.maxPlayers,instant:!0,onChange:s=>{a.maxPlayers=s,i()}})),e.appendChild(X({label:"Min Remaining Time",desc:"Minimum seconds remaining in match (0-480)",min:0,max:480,value:a.minRemainingTime,instant:!0,onChange:s=>{a.minRemainingTime=s,i()}})),e.appendChild(De({header:"Regions (none selected = all)",items:Mt.map(s=>({value:s,label:st[s]||s})),selected:a.regions,onChange:()=>i()})),e.appendChild(De({header:"Gamemodes (none selected = all)",items:Tt.map(s=>({value:s,label:s})),selected:a.gamemodes,onChange:()=>i()})),a.maps||(a.maps=[]),e.appendChild(De({header:"Maps (none selected = all)",items:Rt.map(s=>({value:s,label:It[s]||s})),selected:a.maps,onChange:()=>i()}))}function ta(e,n){const t={enabled:!1,...n};e.appendChild(w({label:"Discord Rich Presence",desc:"Show game activity in your Discord profile",checked:t.enabled,restart:!0,onChange:a=>{t.enabled=a,c.ipcRenderer.invoke("set-config","discord",t)}}))}function Ct(e){const n=window;if(typeof n.loginOrRegister!="function")return;function t(){n.loginOrRegister(),queueMicrotask(()=>{const a=document.querySelector(".auth-toggle-btn");a&&a.textContent?.includes("username")&&a.click(),queueMicrotask(()=>{const i=document.querySelector("#accName"),s=document.querySelector("#accPass");if(!i||!s)return;i.value=e.username,s.value=e.password,i.dispatchEvent(new Event("input",{bubbles:!0})),s.dispatchEvent(new Event("input",{bubbles:!0}));const o=document.querySelector(".io-button");o&&o.click()})})}typeof n.logoutAcc=="function"?(n.logoutAcc(),setTimeout(t,500)):t()}function na(e,n){const t=n||[],a=document.createElement("div");a.className="setting settName safety-0 has-button",a.innerHTML='<span class="setting-title">Add Account</span><button class="kpc-acc-save" style="margin-left:auto;padding:4px 14px;border:none;border-radius:4px;cursor:pointer;font-size:12px;font-family:inherit;background:var(--kpc-accent);color:#fff;">+ Add</button><div class="setting-desc-new">Save a Krunker account for quick switching</div>',e.appendChild(a);const i=document.createElement("div");i.className="kpc-acc-form",i.style.display="none",i.innerHTML='<input type="text" placeholder="Label (e.g. Main, Alt1)" class="kpc-acc-label"><input type="text" placeholder="Krunker Username" class="kpc-acc-user"><input type="password" placeholder="Krunker Password" class="kpc-acc-pass"><div class="kpc-acc-form-buttons"><button class="kpc-acc-save">Save</button><button class="kpc-acc-cancel">Cancel</button></div>',e.appendChild(i);const s=i.querySelector(".kpc-acc-label"),o=i.querySelector(".kpc-acc-user"),r=i.querySelector(".kpc-acc-pass");i.querySelectorAll("input").forEach(f=>{f.addEventListener("keydown",p=>p.stopPropagation())}),a.querySelector("button").addEventListener("click",()=>{i.style.display=i.style.display==="none"?"":"none"}),i.querySelector(".kpc-acc-cancel").addEventListener("click",()=>{i.style.display="none"});const l=document.createElement("div");e.appendChild(l);function d(){if(l.innerHTML="",t.length===0){l.innerHTML='<div class="kpc-acc-empty">No saved accounts</div>';return}t.forEach((f,p)=>{const h=document.createElement("div");h.className="kpc-acc-item",h.innerHTML='<div class="kpc-acc-item-info"><span class="kpc-acc-item-label">'+b(f.label)+'</span></div><div class="kpc-acc-item-actions"><button class="kpc-acc-switch">Switch</button><button class="kpc-acc-delete">Delete</button></div>',h.querySelector(".kpc-acc-switch").addEventListener("click",()=>{c.ipcRenderer.invoke("alt-get-credentials",p).then(v=>{v&&Ct(v)})}),h.querySelector(".kpc-acc-delete").addEventListener("click",()=>{c.ipcRenderer.invoke("alt-remove",p).then(()=>{t.splice(p,1),d()})}),l.appendChild(h)})}d(),i.querySelector(".kpc-acc-save").addEventListener("click",()=>{const f=s.value.trim(),p=o.value.trim(),h=r.value;if(!f||!p||!h)return;const v={label:f,username:p,password:h};c.ipcRenderer.invoke("alt-save",v).then(()=>{t.push({label:f}),s.value="",o.value="",r.value="",i.style.display="none",d()})})}function aa(e,n,t){const a={betterChat:!0,chatHistorySize:200,...n};function i(){c.ipcRenderer.invoke("set-config","game",a)}e.appendChild(w({label:"Better Chat",desc:"Merge team and all-chat with colored [T]/[M] prefixes",checked:a.betterChat,instant:!0,onChange:r=>{a.betterChat=r,i(),Sn(r)}})),e.appendChild(X({label:"Chat History Size",desc:"Maximum chat messages to keep (0 to disable history preservation)",min:0,max:1e3,value:a.chatHistorySize,instant:!0,onChange:r=>{a.chatHistorySize=r,i(),En(r)}}));const s={enabled:!0,targetLanguage:"en",showLanguageTag:!0,...t};function o(){c.ipcRenderer.invoke("set-config","translator",s)}e.appendChild(w({label:"Chat Translator",desc:"Automatically translate non-English chat messages",checked:s.enabled,instant:!0,onChange:r=>{s.enabled=r,o(),Ne({enabled:r})}})),e.appendChild(Me({label:"Target Language",desc:"Language to translate messages into",instant:!0,options:[{value:"en",label:"English"},{value:"es",label:"Spanish"},{value:"fr",label:"French"},{value:"de",label:"German"},{value:"pt",label:"Portuguese"},{value:"ru",label:"Russian"},{value:"ja",label:"Japanese"},{value:"ko",label:"Korean"},{value:"zh",label:"Chinese"},{value:"ar",label:"Arabic"},{value:"hi",label:"Hindi"},{value:"tr",label:"Turkish"},{value:"pl",label:"Polish"},{value:"it",label:"Italian"},{value:"nl",label:"Dutch"}],value:s.targetLanguage,onChange:r=>{s.targetLanguage=r,o(),Ne({targetLanguage:r})}})),e.appendChild(w({label:"Show Language Tag",desc:"Show detected language code before translations (e.g. [FR])",checked:s.showLanguageTag,instant:!0,onChange:r=>{s.showLanguageTag=r,o(),Ne({showLanguageTag:r})}}))}function sa(e,n,t){const i={...{removeUselessFeatures:!0,gpuRasterizing:!1,helpfulFlags:!0,increaseLimits:!1,lowLatency:!1,experimentalFlags:!1,angleBackend:"default",verboseLogging:!1},...n};function s(){c.ipcRenderer.invoke("set-config","advanced",i)}const o=t?[{value:"default",label:"Default (D3D11)"},{value:"gl",label:"OpenGL"},{value:"d3d9",label:"Direct3D 9"},{value:"d3d11",label:"Direct3D 11"},{value:"d3d11on12",label:"D3D11on12"},{value:"vulkan",label:"Vulkan"}]:[{value:"default",label:"Default"},{value:"gl",label:"OpenGL"},{value:"vulkan",label:"Vulkan"}];e.appendChild(Me({label:"ANGLE Backend",desc:"Graphics API used for WebGL rendering",options:o,value:i.angleBackend,restart:!0,onChange:l=>{i.angleBackend=l,s()}}));const r=[{key:"removeUselessFeatures",label:"Remove Useless Features",desc:"Disables crash reporting, metrics, print preview, and other unused Chromium features",safety:1},{key:"gpuRasterizing",label:"GPU Rasterization",desc:"Force GPU rasterization and out-of-process rasterization",safety:2},{key:"helpfulFlags",label:"Useful Flags",desc:"Enables WebGL, JS harmony, V8 features, background throttle prevention, and autoplay bypass",safety:3},{key:"increaseLimits",label:"Increase Limits",desc:"Raises renderer process, WebGL context, and WebRTC CPU limits; ignores GPU blocklist",safety:4},{key:"lowLatency",label:"Low Latency Flags",desc:"Enables high-resolution timer, QUIC protocol, and high-performance GPU",safety:4},{key:"experimentalFlags",label:"Experimental Flags",desc:"Enables accelerated video decode, native GPU memory buffers, high DPI support, and disables pings/proxy",safety:4}];for(const l of r)e.appendChild(w({label:l.label,desc:l.desc,checked:!!i[l.key],restart:!0,safety:l.safety,onChange:d=>{i[l.key]=d,s()}}));e.appendChild(w({label:"Verbose Logging",desc:"Forward all preload console output to the Electron log file",checked:i.verboseLogging,instant:!0,onChange:l=>{i.verboseLogging=l,s(),Qe=l}}))}function ia(e,n,t){const a=t.toLowerCase(),i=Array.from(e.children).filter(o=>o.querySelector(".setHed"));i.forEach(o=>{const r=o.querySelector(".setHed")?.textContent?.toLowerCase()||"",l=o.querySelector(".setBodH");if(!l){o.style.display="none";return}if(r.includes(a)){l.classList.remove("setting-category-collapsed");return}let d=0;Array.from(l.children).forEach(f=>{const p=f;(p.textContent?.toLowerCase()||"").includes(a)?(p.style.display="",d++):p.style.display="none"}),d===0?o.style.display="none":l.classList.remove("setting-category-collapsed")}),i.find(o=>o.style.display!=="none")&&Array.from(n.children).forEach(o=>{o.textContent?.toLowerCase().includes("no settings")&&o.remove()})}function re(e){const n=document.getElementById("settHolder");if(!n)return;if(fe=0,M&&(M.remove(),M=null),e){const m=n.querySelector(".kpc-settings");m&&m.remove()}else for(;n.firstChild;)n.removeChild(n.firstChild);const t=document.createElement("div");t.className="kpc-settings";const a=document.createElement("div");a.className="kpc-action-grid";const i=[{label:"Open Resource Swapper",color:"kpc-ab-pink",action:()=>c.ipcRenderer.invoke("open-swap-folder")},{label:"Reset Resource Swapper",color:"kpc-ab-pink",action:()=>{confirm("Reset resource swapper? This will delete all files in the swapper folder.")&&c.ipcRenderer.invoke("reset-swapper")}},{label:"Open Electron Logs",color:"kpc-ab-red",action:()=>c.ipcRenderer.invoke("open-electron-log")},{label:"Restart Client",color:"kpc-ab-orange",full:!0,action:()=>c.ipcRenderer.invoke("restart-client")},{label:"Reset Options",color:"kpc-ab-red",action:()=>{confirm("Reset all settings to defaults? The client will restart.")&&c.ipcRenderer.invoke("reset-options")}},{label:"Delete All Data",color:"kpc-ab-red",action:()=>{confirm("Delete all data (config, logs)? Scripts are preserved. The client will restart.")&&c.ipcRenderer.invoke("delete-all-data")}}];for(const m of i){const k=document.createElement("button");k.className="kpc-action-btn "+m.color+(m.full?" full":""),k.textContent=m.label,k.addEventListener("click",m.action),a.appendChild(k)}t.appendChild(a);const s=R("General");t.appendChild(s.section);const o=R("Game");t.appendChild(o.section);const r=R("Performance");t.appendChild(r.section);const l=R("Swapper");t.appendChild(l.section);const d=R("Appearance");t.appendChild(d.section);const f=R("Matchmaker");t.appendChild(f.section);const p=R("Chat");t.appendChild(p.section);const h=R("Discord");t.appendChild(h.section);const v=R("Accounts",!0);t.appendChild(v.section);const u=R("Advanced");t.appendChild(u.section);const y=R("Userscripts");t.appendChild(y.section),Promise.all([c.ipcRenderer.invoke("get-all-config",["swapper","matchmaker","keybinds","advanced","game","ui","discord","translator","accounts","performance"]),c.ipcRenderer.invoke("get-platform")]).then(([m,k])=>{const g=m.swapper,x=m.matchmaker,L=m.keybinds,N=m.advanced,S=m.game,C=m.ui,P=m.discord,T=m.translator,oe={...{matchmaker:{key:"F6",ctrl:!1,shift:!1,alt:!1},matchmakerCancel:{key:"Escape",ctrl:!1,shift:!1,alt:!1},fullscreenToggle:{key:"F11",ctrl:!1,shift:!1,alt:!1}},...L},Ie=k&&k.isWindows,Re={binds:oe,saveBinds:()=>c.ipcRenderer.invoke("set-config","keybinds",oe),isWindows:Ie};Vn(s.body,S,C,Re),Yn(o.body,S,C,Re),Xn(r.body,m.performance,Ie),Jn(l.body,g),Zn(d.body,C),ea(f.body,x,Re),aa(p.body,S,T),ta(h.body,P),na(v.body,m.accounts),sa(u.body,N,Ie),oa(y.body),e&&ia(t,n,e),n.appendChild(t)}).catch(m=>{console.error("[KCC] Settings render error:",m)})}function oa(e){c.ipcRenderer.invoke("get-config","userscripts").then(n=>{const t=n||{enabled:!0,path:""};e.appendChild(w({label:"Userscripts",desc:"Load custom scripts from the scripts folder",checked:t.enabled,restart:!0,onChange:o=>{t.enabled=o,c.ipcRenderer.invoke("set-config","userscripts",t)}}));const a=document.createElement("div");a.className="setting settName safety-0 has-button",a.innerHTML='<span class="setting-title">Scripts Folder</span><div class="setting-desc-new">Place .js userscript files here</div>';const i=document.createElement("div");i.className="settingsBtn",i.title="Open Folder",i.innerHTML='<span class="material-icons">folder</span> Scripts',i.addEventListener("click",()=>c.ipcRenderer.invoke("userscripts-open-folder")),a.appendChild(i),e.appendChild(a);const s=jt();if(s.length===0){const o=document.createElement("div");o.className="setting settName safety-0",o.innerHTML='<div class="setting-desc-new">No userscripts found. Place .js files in the scripts folder and reload.</div>',e.appendChild(o);return}for(const o of s){const r=document.createElement("div");r.className="setting settName safety-0 bool";const l=b(o.meta.name||o.filename),d=[];o.meta.author&&d.push("by "+b(o.meta.author)),o.meta.version&&d.push("v"+b(o.meta.version));const f=d.length>0?'<span class="kpc-us-meta">'+d.join(" &middot; ")+"</span>":"",p=b(o.meta.desc||"");r.innerHTML='<span class="setting-title">'+l+'</span><label class="switch"><input type="checkbox" class="s-update"'+(o.enabled?" checked":"")+'><div class="slider round"></div></label><div class="setting-desc-new">'+p+(f?"<br>"+f:"")+"</div>",e.appendChild(r);const h=r.querySelector('input[type="checkbox"]'),v=document.createElement("div");v.className="kpc-us-settings",e.appendChild(v),o.enabled&&o.settings&&at(o,v),h.addEventListener("change",()=>{const{needsReload:u}=Qt(o.filename,h.checked,B);v.innerHTML="",h.checked&&o.settings&&at(o,v),u&&I("refresh")})}})}function at(e,n){if(e.settings)for(const[,t]of Object.entries(e.settings)){const a=t.type==="bool"?"bool":t.type==="sel"?"sel":t.type==="num"?"num":t.type==="keybind"?"keybind":"",i=document.createElement("div");switch(i.className="setting settName safety-0"+(a?" "+a:""),i.innerHTML='<span class="setting-title">'+b(t.title)+"</span>"+(t.desc?'<div class="setting-desc-new">'+b(t.desc)+"</div>":""),t.type){case"bool":{const s=document.createElement("label");s.className="switch",s.innerHTML='<input type="checkbox" class="s-update"'+(t.value?" checked":"")+'><div class="slider round"></div>',i.appendChild(s);const o=s.querySelector("input");o.addEventListener("change",()=>{t.value=o.checked,typeof t.changed=="function"&&t.changed(t.value),le(e)});break}case"num":{const s=document.createElement("input");s.type="number",s.className="rb-input s-update sliderVal",s.value=String(t.value),t.min!==void 0&&(s.min=String(t.min)),t.max!==void 0&&(s.max=String(t.max)),t.step!==void 0&&(s.step=String(t.step)),i.appendChild(s),s.addEventListener("change",()=>{t.value=parseFloat(s.value)||0,typeof t.changed=="function"&&t.changed(t.value),le(e)});break}case"sel":{const s=document.createElement("select");if(s.className="s-update inputGrey2",t.opts)for(const o of t.opts){const r=document.createElement("option");r.value=String(o),r.textContent=String(o),String(o)===String(t.value)&&(r.selected=!0),s.appendChild(r)}i.appendChild(s),s.addEventListener("change",()=>{t.value=s.value,typeof t.changed=="function"&&t.changed(t.value),le(e)});break}case"color":{const s=document.createElement("input");s.type="color",s.className="kpc-color-input",s.value=String(t.value)||"#ffffff",i.appendChild(s),s.addEventListener("input",()=>{t.value=s.value,typeof t.changed=="function"&&t.changed(t.value),le(e)});break}case"keybind":{const s=t.value,o=document.createElement("span");o.className="keyIcon kpc-keyIcon",o.textContent=xe(s),o.addEventListener("click",()=>{bt(t.title).then(r=>{t.value=r,o.textContent=xe(r),typeof t.changed=="function"&&t.changed(t.value),le(e)})}),i.appendChild(o);break}}n.appendChild(i)}}function le(e){if(!e.settings)return;const n={};for(const[t,a]of Object.entries(e.settings))n[t]=a.value;c.ipcRenderer.invoke("userscripts-save-prefs",e.filename,n)}let me=null;const ra="#leftTabsHolder > .youNewDiv:not(#battlepassAd), .webpush-container, #homeStoreAd, #streamContainerNew, #bundlePop, #genericPop.claimPop, #newsHolder, #streamContainer { display: none !important; }",wt=["homeStoreAd","streamContainerNew"];function Ge(){if(me)return;if(!document.getElementById("kpc-hideMenuPopups")){const n=document.createElement("style");n.id="kpc-hideMenuPopups",n.textContent=ra,document.head.appendChild(n)}const e=window;me=setInterval(()=>{for(const a of wt){const i=document.getElementById(a);i&&i.style.display!=="none"&&(i.style.display="none")}const n=document.getElementById("bundlePop");n&&n.children.length>0&&n.style.display!=="none"&&typeof e.clearPops=="function"&&e.clearPops();const t=document.getElementById("genericPop");t&&t.classList.contains("claimPop")&&t.style.display!=="none"&&typeof e.clearPops=="function"&&e.clearPops()},1e3)}function la(){me&&(clearInterval(me),me=null);const e=document.getElementById("kpc-hideMenuPopups");e&&e.remove();for(const n of wt){const t=document.getElementById(n);t&&(t.style.display="")}}c.ipcRenderer.on("matchmaker-find",(e,n)=>{zt(n,B).catch(t=>B.error("[KCC] Matchmaker error:",t))});c.ipcRenderer.on("main_did-finish-load",()=>{B.log("[KCC] did-finish-load received, waiting to hook settings...");const e=window.location.pathname==="/"||window.location.pathname==="";window.closeClient=()=>window.close(),Promise.all([c.ipcRenderer.invoke("get-all-config",["ui","userscripts","game","translator","keybinds","discord","advanced","performance"]),c.ipcRenderer.invoke("get-platform"),c.ipcRenderer.invoke("get-version")]).then(([t,a,i])=>{const s=t.ui,o=t.userscripts,r=t.game,l=t.translator,d=t.discord;Qe=t.advanced?.verboseLogging??!1;const p=s?s.showExitButton!==!1:!0,h=()=>{const u=document.getElementById("clientExit");return u?(u.style.display=p?"flex":"none",!0):!1};if(!h()){let u=0;const y=setInterval(()=>{(h()||++u>30)&&clearInterval(y)},500)}if(s?.deathscreenAnimation&&Fe(!0),s?.hideMenuPopups&&Ge(),(s?.menuTimer??!0)&&_e(!0),e&&(s?.doublePing??!0)&&jn(),e&&(r?.showPing??!0)&&Wn(),e&&process.platform==="win32"&&(r?.rawInput??!0)){const u=HTMLCanvasElement.prototype.requestPointerLock;HTMLCanvasElement.prototype.requestPointerLock=function(y){const m=u.call(this,{...y,unadjustedMovement:!0});return m&&typeof m.catch=="function"?m.catch(()=>u.call(this,y)):m}}if(e&&wn({betterChat:r?.betterChat??!0,chatHistorySize:r?.chatHistorySize??200},B),e&&(r?.hpEnemyCounter??!0)&&ht(),e&&Hn(),e){let u=!1;setInterval(()=>{const y=document.getElementById("uiBase"),m=!!y&&y.className!=="onMenu"&&y.className!=="";m!==u&&(u=m,c.ipcRenderer.send("throttle-state",u?"game":"menu"))},2e3)}if(e&&(s?.showChangelog??!0)&&Kn(i,s?.lastSeenVersion||""),e){const u=()=>Array.from(document.querySelectorAll(".bpClaimB")).filter(y=>y.offsetParent!==null&&y.textContent?.trim()==="Claim");setInterval(()=>{const y=document.querySelector(".bpBotH");if(!y||y.offsetParent===null)return;const m=document.getElementById("claimAllBtn");if(m){u().length>0?(m.textContent="Claim All",m.classList.remove("disabled")):(m.textContent="Nothing to Claim",m.classList.add("disabled"));return}const k=u(),g=document.createElement("div");g.className="bpBtn skip",g.id="claimAllBtn",g.style.cssText="margin-left: 8px; cursor: pointer; background: #4CAF50;",k.length>0?g.textContent="Claim All":(g.textContent="Nothing to Claim",g.classList.add("disabled")),g.addEventListener("click",async()=>{if(g.classList.contains("disabled"))return;window.playSelect?.(.1);const x=u();if(x.length===0)return;g.textContent="Claiming...",g.classList.add("disabled");for(const N of x)N.click(),await new Promise(S=>setTimeout(S,200));const L=u();g.textContent=L.length>0?"Claim All":"Nothing to Claim",g.classList.toggle("disabled",L.length===0)}),y.appendChild(g)},500)}if((o?o.enabled:!0)&&Wt(B).catch(u=>B.error("[KCC] Userscript init error:",u)),e&&r?.joinAsSpectator){let u=0;const y=setInterval(()=>{if(++u>300){clearInterval(y);return}const m=document.getElementById("uiBase");if(!(!m||m.className===""))if(m.className==="onMenu"){const k=document.querySelector("#spectButton input");k&&!k.checked&&window.setSpect(1),clearInterval(y)}else clearInterval(y)},100)}if(e){const u={enabled:!0,targetLanguage:"en",showLanguageTag:!0,...l};gn(B,u)}if(e&&d?.enabled){let u=function(){let g,x="",L;const N=window,S=N.spectating;let C=null;if(typeof N.getGameActivity=="function")try{C=N.getGameActivity()}catch{}if(S)g="Spectating",C?.map&&(x=C.map);else{const P=document.getElementById("uiBase");if(P&&P.className==="onMenu")g="In Menus";else{if(C?.mode&&C?.map?g=C.mode+" on "+C.map:g=document.getElementById("mapInfo")?.textContent||"Playing Krunker",C?.class?.name)x=C.class.name;else{const T=document.getElementById("menuClassName");T?.textContent&&(x=T.textContent)}L=k}}(g!==y||x!==m)&&(L&&y!==g&&(k=Math.floor(Date.now()/1e3),L=k),y=g,m=x,c.ipcRenderer.send("discord-update",{details:g,state:x||void 0,startTimestamp:L,largeImageKey:"krunker",largeImageText:"Krunker Civilian Client"}))},y="",m="",k=Math.floor(Date.now()/1e3);u(),setInterval(u,5e3),document.addEventListener("pointerlockchange",u)}e&&c.ipcRenderer.invoke("alt-list").then(()=>{const u=document.createElement("div");u.id="kpcAltBtn",u.className="menuItem",u.setAttribute("onmouseenter","playTick()"),u.innerHTML='<span class="material-icons-outlined menBtnIcn" style="color:#4fc3f7">people</span><div class="menuItemTitle" style="font-size:13px">Accounts</div>';function y(){const k=document.getElementById("windowHolder"),g=document.getElementById("menuWindow"),x=document.getElementById("windowHeader");if(!k||!g||!x)return;if(k.style.display!=="none"&&x.innerText==="Alt Manager"){k.style.display="none";return}k.className="popupWin",k.style.display="block",g.classList.value="dark",g.style.cssText="width:800px;max-height:calc(100% - 330px);overflow-y:auto;top:50%;transform:translate(-50%,-50%);",x.innerText="Alt Manager";function L(){c.ipcRenderer.invoke("alt-list").then(S=>{let C='<div style="font-size:30px;text-align:center;margin:3px;font-weight:700;color:#fff;">Alt Manager</div><hr style="color:rgba(28,28,28,.5);"><div class="button buttonPI lgn" id="kpcAltAddBtn" style="text-align:center;width:98%;margin:3px;padding-top:5px;padding-bottom:13px;">Add Account</div><div class="amHolder" style="display:flex;flex-direction:column;justify-content:center;">';!S||S.length===0?C+='<div style="color:rgba(255,255,255,0.4);text-align:center;padding:20px 0;font-size:18px;">No saved accounts</div>':S.forEach((T,H)=>{C+='<div class="amAccName" style="display:flex;justify-content:flex-end;align-items:center;padding:4px 0;"><span style="margin-right:auto;color:#fff;font-size:18px;">'+b(T.label)+'</span><div class="button buttonG lgn kpc-alt-login" data-idx="'+H+'" style="width:70px;margin-right:0;padding-top:3px;padding-bottom:15px;transform:scale(0.75);"><span class="material-icons" style="vertical-align:bottom;color:#fff;font-size:30px;margin-bottom:-1px;">login</span></div><div class="verticalSeparator" style="height:35px;background:rgba(28,28,28,.3);"></div><div class="button buttonR lgn kpc-alt-del" data-idx="'+H+'" style="width:70px;margin-right:0;padding-top:3px;padding-bottom:15px;transform:scale(0.75);"><span class="material-icons" style="vertical-align:bottom;color:#fff;font-size:30px;margin-bottom:-1px;">delete</span></div></div>'}),C+="</div>",g.innerHTML=C;const P=document.getElementById("kpcAltAddBtn");P&&P.addEventListener("click",N),g.querySelectorAll(".kpc-alt-login").forEach(T=>{T.addEventListener("click",()=>{const H=parseInt(T.dataset.idx||"0",10);S[H]&&(k.style.display="none",c.ipcRenderer.invoke("alt-get-credentials",H).then(oe=>{oe&&Ct(oe)}))})}),g.querySelectorAll(".kpc-alt-del").forEach(T=>{T.addEventListener("click",()=>{const H=parseInt(T.dataset.idx||"0",10);confirm('Delete account "'+(S[H]?.label||"")+'"?')&&c.ipcRenderer.invoke("alt-remove",H).then(()=>L())})})})}function N(){g.innerHTML='<div class="setBodH" style="padding:20px;"><div style="font-size:25px;text-align:center;margin-bottom:15px;color:#fff;">Add Account</div><input class="accountInput" id="kpcAltLabel" type="text" placeholder="Label (e.g. Main, Alt1)" style="width:100%;margin-bottom:8px;"><input class="accountInput" id="kpcAltUser" type="text" placeholder="Krunker Username" style="width:100%;margin-bottom:8px;"><input class="accountInput" id="kpcAltPass" type="password" placeholder="Krunker Password" style="width:100%;margin-bottom:15px;"><div style="display:flex;gap:8px;"><div class="button buttonG lgn" id="kpcAltSaveBtn" style="flex:1;text-align:center;padding-top:5px;padding-bottom:13px;">Add Account</div><div class="button buttonR lgn" id="kpcAltBackBtn" style="width:120px;text-align:center;padding-top:5px;padding-bottom:13px;">Back</div></div></div>',g.querySelectorAll("input.accountInput").forEach(S=>{S.addEventListener("keydown",C=>C.stopPropagation())}),document.getElementById("kpcAltBackBtn").addEventListener("click",L),document.getElementById("kpcAltSaveBtn").addEventListener("click",()=>{const S=document.getElementById("kpcAltLabel").value.trim(),C=document.getElementById("kpcAltUser").value.trim(),P=document.getElementById("kpcAltPass").value;!S||!C||!P||c.ipcRenderer.invoke("alt-save",{label:S,username:C,password:P}).then(()=>L())})}L()}u.addEventListener("click",k=>{k.stopPropagation(),window.playSelect?.(),y()});function m(){if(document.getElementById("kpcAltBtn"))return!0;const k=document.getElementById("menuItemContainer");if(!k)return!1;const g=document.getElementById("clientExit");return g?k.insertBefore(u,g):k.appendChild(u),!0}if(!m()){let k=0;const g=setInterval(()=>{(m()||++k>60)&&clearInterval(g)},500)}})}).catch(()=>{});const n=setInterval(()=>{const t=window;Object.hasOwn(t,"showWindow")&&typeof t.showWindow=="function"&&Object.hasOwn(t,"windows")&&Array.isArray(t.windows)&&t.windows.length>=0&&typeof t.windows[0]<"u"&&typeof t.windows[0].changeTab=="function"&&(clearInterval(n),B.log("[KCC] Settings window found, hooking..."),Qn())},500)});c.ipcRenderer.on("main_did-finish-load-tab",()=>{B.log("[KCC] Tab page loaded"),window.closeClient=()=>window.close()});
{
  "name": "krunker-civilian-client",
  "version": "0.8.0",
  "description": "Cross-platform Krunker game client",
  "main": "dist/main/index.js",
  "homepage": "https://github.com/bigjakk/Krunker-Civilian-Client",
  "author": "Krunker Civilian Client <krunker@crjlab.net>",
  "license": "GPL-3.0",
  "lint-staged": {
    "src/**/*.ts": "eslint --fix"
  },
  "dependencies": {
    "electron-store": "^8.2.0"
  }
}